联赛模拟测试24 B. 答题 折半枚举
题目描述


分析
暴力的思想是把 \(2^n\) 种得分枚举出来,每一种得分的概率都是相同的,然后从小到大累加,直到大于等于所给的概率
把问题转化一下,就变成了在 \(2^n\) 种元素中求 \(k\) 小值
\(n\) 的范围是 \(40\), \(2^{40}\) 不可过,但是 \(2^{20}\)可过
把序列分成两半,每一半的大小都是 \(2^{n/2}\),分别排序
二分 \(k\) 大值,在另一半中查找与当前这一半中某个元素的和恰好小于等于当前值的元素个数
因为元素大小具有单调性,所以二分没有必要,改成双指针
时间复杂度 \(log(n \times m) \times 2^{n/2}\)
代码
#include<cstdio>
#include<algorithm>
#include<cmath>
#define rg register
typedef long long ll;
const int maxn=22;
int n,a[maxn<<1],bef[1<<maxn],lat[1<<maxn],tp1,tp2,zg;
ll k;
double p,now;
void dfs1(int now,int tot){
	if(now>n/2){
		bef[++tp1]=tot;
		return;
	}
	dfs1(now+1,a[now]+tot);
	dfs1(now+1,tot);
}
void dfs2(int now,int tot){
	if(now>n){
		lat[++tp2]=tot;
		return;
	}
	dfs2(now+1,a[now]+tot);
	dfs2(now+1,tot);
}
bool jud(int val){
	rg int now=tp2;
	rg ll ans=0;
	for(rg int i=1;i<=tp1;i++){
		while(lat[now]+bef[i]>val && now>0) now--;
		ans+=now;
	}
	return ans>=k;
}
int main(){
	scanf("%d%lf",&n,&p);
	for(rg int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		zg+=a[i];
	}
	now=1.0;
	for(rg int i=1;i<=n;i++){
		now=now*0.5;
	}
	k=(ll)std::ceil((double)p/now);
	dfs1(1,0);
	dfs2(n/2+1,0);
	std::sort(bef+1,bef+1+tp1);
	std::sort(lat+1,lat+1+tp2);
	rg int l=0,r=zg,mids;
	while(l<=r){
		mids=(l+r)>>1;
		if(jud(mids)) r=mids-1;
		else l=mids+1;
	}
	printf("%d\n",l);
	return 0;
}
联赛模拟测试24 B. 答题 折半枚举的更多相关文章
- 联赛模拟测试24  D. 你相信引力吗 单调栈
		题目描述 分析 因为跨过最大值的区间一定是合法的,所以我们人为地把最大值放在最左边 我们要统计的就是在最大值右边单调不降的序列,可以用单调栈维护 需要特殊处理相同的情况 代码 #include< ... 
- 联赛模拟测试8 Dash Speed 线段树分治
		题目描述 分析 对于测试点\(1\).\(2\),直接搜索即可 对于测试点\(3 \sim 6\),树退化成一条链,我们可以将其看成序列上的染色问题,用线段树维护颜色相同的最长序列 对于测试点\(7\ ... 
- 联赛模拟测试17  A. 简单的区间 启发式合并
		题目描述 分析 我们要找的是一段区间的和减去该区间的最大值能否被 \(k\) 整除 那么对于一段区间,我们可以先找出区间中的最大值 然后枚举最大值左边的后缀与最大值右边的前缀之和是否能被 \(k\) ... 
- 联赛模拟测试18  A. 施工 单调队列(栈)优化DP
		题目描述 分析 对于 \(Subtask\ 1\),可以写一个 \(n^3\) 的 \(DP\),\(f[i][j]\) 代表第 \(i\) 个建筑高度为 \(j\) 时的最小花费,随便转移即可 时间 ... 
- 联赛模拟测试20   C. Weed
		题目描述 \(duyege\) 的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,\(duyege\) 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在 ... 
- 联赛模拟测试22  B. 分组配对 倍增+二分
		题目描述 分析 首先,容易发现一个小组内的最优配对方式(能得到最大综合实力的方式) 一定是实力值最大的男生和最大的女生配对,次大的和次大的配对,以此类推. 但是每次新插入一个值时,需要用 \(nlog ... 
- [考试反思]0817NOIP模拟测试24:冲淡
		一切都还好吗? 是啊,还好. 前两名仍然被外校包揽/ B哥140撑住场面,120/110/100不等.我90分混吃等死排了个大并列第10. 考前说要考凸包,打开了几个博客慢慢看一直到考试开始. 然而我 ... 
- 联赛模拟测试5   涂色游戏 矩阵优化DP
		题目描述 分析 定义出\(dp[i][j]\)为第\(i\)列涂\(j\)种颜色的方案数 然后我们要解决几个问题 首先是求出某一列涂恰好\(i\)种颜色的方案数\(d[i]\) 如果没有限制必须涂\( ... 
- 联赛模拟测试10 C. 射手座之日
		题目描述 分析 方法一(线段树) 线段树维护的是以当前节点为左端点的区间的贡献 而区间的右端点则会从 \(1\) 到 \(n\) 逐渐右移 当我们把右端点从 \(i-1\) 的位置扩展到 \(i\) ... 
随机推荐
- 4.案例 - NIO实现TCP通信
			服务端: package cn.tedu.nio.channel; import java.net.InetSocketAddress; import java.nio.ByteBuffer; imp ... 
- 【大数据】MapReduce开发小实战
			Before:前提:hadoop集群应部署完毕. 一.实战科目:做一个Map Reduce分布式开发,开发内容为统计文件中的单词出现次数. 二.战前准备 1.本人在本地创建了一个用于执行MR的的文件, ... 
- 生命周期(初始化、销毁方法、BeanPostProcessor后处理Bean)
			1.初始化和销毁 在目标方法执行前后进行初始化或销毁 (1)在Service方法的实现类里面创建初始化方法和销毁方法: public class StudentServiceImpl implemen ... 
- Python-对字典进行排序
			案例: 某班英语成绩以字典的形式存储为: {'lili':78, 'jin':50, 'liming': 30, ......} 依据成绩高低,进行学生成绩排名 如何对字典排序? 方法1: #!/us ... 
- mysql-16-variables
			#变量 /* 系统变量: 全局变量 会话变量 自定义变量: 用户变量 局部变量 */ # 一.系统变量 #由系统提供,属于服务器层面 #1.查看所有的系统变量 show global variable ... 
- 063 01 Android 零基础入门  01 Java基础语法 08 Java方法 01 无参无返回值方法
			063 01 Android 零基础入门 01 Java基础语法 08 Java方法 01 无参无返回值方法 本文知识点:无参无返回值方法 无参无返回值方法 案例 为什么使用方法?--方便复杂问题调用 ... 
- C++中cout.setf()和cout.precision()
			这两个就是格式控制的~ostream成员函数里面的,也可以用输出流操作符来控制,都一样的~附给你一些看看~ 其中cout.setf跟setiosflags一样的,cout.precision跟setp ... 
- JVM 第三篇:Java 类加载机制
			本文内容过于硬核,建议有 Java 相关经验人士阅读. 1. 什么是类的加载? 类的加载指的是将类的 .class 文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 ... 
- RHSA-2018:3665-重要: NetworkManager 安全更新
			[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ... 
- html     ul li 自定义宽
			1. ul里面的样式 2. ul li 里面的样式 
