[ABC184F] Programming Contest题解
前置知识
meet in middle (折半搜索)
会的大佬请跳过
不会的请自己前往oi wiki或CSDN(百度吧,少年)
解题思路
纯暴力
看完题目考虑将每一种情况计算出来,排序后找不超过T的最大值
因为每个数有(选/不选)两种情况
所以总共2^n种结果
显而易见,时间复杂度 O(2^n)
n=40时,显然会G
正解
引出
暴力思路告诉我们,现在需要一种优秀的算法(奇技淫巧)来帮助我们
从庞大的信竞知识中,我们找到了折半搜索;
步骤
- 将数据分成2组,1到n/2一组,n/2+1到n为一组
- 每组单独算情况,存在数组中
- 两个结果数组单独排序(升序)
- a指针从第一组结果数组的第一个元素,b指针从第二组结果数组的最后一个元素(没学过指针怎么办?变量模拟即可,详见代码)
- 如果两个元素之和大于T,b--
- 否则用元素之和更新答案(正确性显然,自己思考)
AC代码
#include <bits/stdc++.h>
using namespace std;
long long n,t,mx,sz[42],a[1050000],b[1050000],tota,totb;
void dfs(int qd,int zd,int lim,long long zhi)
{
if(qd>zd)return ;
if(zhi+sz[qd]>t)
{
dfs(qd+1,zd,lim,zhi);
return;
}
if(lim==1)a[++tota]=zhi+sz[qd];
else b[++totb]=zhi+sz[qd];
dfs(qd+1,zd,lim,zhi);
dfs(qd+1,zd,lim,zhi+sz[qd]);
return;
}
int main()
{
scanf("%lld%lld",&n,&t);
for(int i=1;i<=n;i++)
{
scanf("%lld",&sz[i]);
}
dfs(1,n/2,1,0);
dfs(n/2+1,n,2,0);
sort(a+1,a+tota+1);
sort(b+1,b+totb+1);
int zz=1,yz=totb;
while(zz<=tota&&yz>=1)
{
while(a[zz]+b[yz]>t)yz--;
if(yz<1)break;
if(a[zz]+b[yz]>mx)mx=a[zz]+b[yz];
zz++;
}
printf("%lld\n",max(mx,max(a[tota],b[totb])));
return 0;
}写在最后
求审核放过孩子的第一篇正经题解
欢迎各位大佬评论区指点一二,三克油
[ABC184F] Programming Contest题解的更多相关文章
- 2015 Syrian Private Universities Collegiate Programming Contest 题解
题目在这里>_< 发现这场比赛在网上没有完整的题解,甚至连题目代码都没人贴出来(大概是因为题目太水了吧...).所以宝宝就来写个题解,也就当作成长记录了233333 A. Window 题 ...
- 2015 ACM Amman Collegiate Programming Contest 题解
[题目链接] A - Who Is The Winner 模拟. #include <bits/stdc++.h> using namespace std; int T; int n; s ...
- 2013-2014 ACM-ICPC Brazil Subregional Programming Contest 题解
[题目链接] 这场比赛题面英文都好长... ... A - Zero or One 模拟. #include <bits/stdc++.h> using namespace std; in ...
- 2017, X Samara Regional Intercollegiate Programming Contest 题解
[题目链接] A - Streets of Working Lanterns - 2 首先将每一个括号匹配串进行一次缩减,即串内能匹配掉的就匹配掉,每个串会变成连续的$y$个右括号+连续$z$个左括号 ...
- 2017 ACM Amman Collegiate Programming Contest 题解
[题目链接] A - Watching TV 模拟.统计一下哪个数字最多即可. #include <bits/stdc++.h> using namespace std; const in ...
- The 2015 China Collegiate Programming Contest Game Rooms
Game Rooms Time Limit: 4000/4000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- Programming Contest Ranking(题解)
Programming Contest Ranking . 题目描述 Heilongjiang Programming Contest will end successfully! And your ...
- KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解
KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...
- M-SOLUTIONS Programming Contest 2020 题解
M-SOLUTIONS Programming Contest 2020 题解 目录 M-SOLUTIONS Programming Contest 2020 题解 A - Kyu in AtCode ...
- 2016 Sichuan Province Programming Contest
2016 Sichuan Province Programming Contest 代码 2016 Sichuan Province Programming Contest A. Nearest Ne ...
随机推荐
- RK 平台安装 ubuntu 系统
一.简介 之前有介绍到 ARM 平台移植 ubuntu 的操作流程,在 RK 系列的平台同样适用,所以这里就不介绍怎么一步步的去对 ubuntu 进行移植,而是怎么将移植的过程编写成脚本,这样便可以在 ...
- Treap,Splay & LCT 学习笔记
从二叉搜索树到平衡树 二叉搜索树(Binary Search Tree)是一种二叉树的树形数据结构,它维护一个集合,并保证它的中序遍历按照递增顺序给出了这个集合的所有元素.由此,可以完成插入,删除,查 ...
- 19、python 脚本
1.python 安装及配置 下载地址 python2 和 python3 共存安装 2.python 可视化 import turtle turtle.pensize(2) #画一个小圆 turtl ...
- linux diff求两个文件的差集
awk 从文本中过滤出需要的ip queryId_20231109214653_ipBatchQueryResult.json {"id":0,"ip":&qu ...
- WebKist Inside: CSS 样式表的组成
1 StyleSheet 一张 StyleSheet 由一系列 Rules 组成,这些 Rules 可以分成 2 大类: 1 Style Rule 2 At-Rule 下面的例子展示了 Style R ...
- 10分钟了解Flink SQL使用
Flink 是一个流处理和批处理统一的大数据框架,专门为高吞吐量和低延迟而设计.开发者可以使用SQL进行流批统一处理,大大简化了数据处理的复杂性.本文将介绍Flink SQL的基本原理.使用方法.流批 ...
- Ceph配置与认证授权
目录 Ceph配置与认证授权 1. 为什么现在不采用修改配置文件的方式了呢? 2. Ceph元变量 3. 使用命令行修改配置 3.1 全部修改(使用服务名) 3.2 部分修改(修改进程) 3.3 临时 ...
- TestMarkdown1
VSCode 实时预览还需要执行 Markdown: Open Preview to the Side 命令来实现. 在命令窗口输入 Markdown: Open Preview to the Sid ...
- GNU GCC学习
1 Introduction 参考视频:1 GCC简介_哔哩哔哩_bilibili 参考书籍:<An Introduction to GCC (Brian J. Gough, Richard.p ...
- Java求两个List集合的交集、并集、差集
在项目中经常会求解集合的交集.并集.差集,这里做个记录.首先创建两个集合list1.list2以及添加元素. List<String> list1 = new ArrayList<& ...