智商杯考试

题目连接:

http://acm.uestc.edu.cn/#/problem/show/1277

Description

你是一个挂科选手。

你现在正在考试,你很方。

你参加的考试叫做智商杯考试。

这个考试很奇怪,考试一开始就把所有答案全部发给你了,但是并不告诉你答案和考试题目的对应关系,也就是说你根本不知道这个答案是哪个题目的。

由于智商低的原因,你根本看不懂题目,所以从题目来推断答案究竟属于哪个题目是不可能的……

但是别慌,你可以向监考老师提问嘛。

智商杯的监考老师可是很人道的哦。

他允许你一次性最多问m个答案的对应关系,他会告诉你这m个答案对应哪m道题,当然,他不会告诉你具体的对应关系。 比如:

你可以问:1,2,3号答案对应哪些问题?
监考老师说:对应3,7,9号问题。 假设你比较蛋疼,你问:1,1,2,3号对应哪些问题?
监考老师说:对应3,7,9号问题。

现在问题来了,考试一共有n道问题,你每次提问最多提及m个答案,你需要最少问多少次呢?

Input

两个整数,1<=n,m<=1e9。

Output

输出一个整数,表示最少询问次数。

Sample Input

15 4

Sample Output

6

Hint

题意

题解:

每周一题 题解

div2 智商杯考试

首先这道题正面想比较麻烦。

现在我们假设你知道了MaxN(m,k),即表示每次最多提及m个问题,我询问k次,最多知道多少个答案和题目对应的这个函数。

那么我直接二分答案就好了

只要解决了MaxN(m,k),那么原题就解决了。

然后怎么去处理这个呢?

我们这样想,我们一开始有n个k位二进制数,如果在第i轮回答中提及到了第j个问题的话,那么就令第j个二进制数的第i位为1。

分析一下样例一,n = 4,k = 2,m = 2的情况:

1 0 1 0

1 1 0 0

可以看到第一个问题的序列是11,第二个问题的序列是01,第三个是10,第四个是00

由于这些二进制数都不一样,因此你能分辨出来。

只要我们最后的n个k位二进制数全部不一样,你就能分辨。

这个证明也很简单,如果有两个二进制数相同的话,那么肯定就可以交换着两个的问题的对应关系了。

那么我们怎么去询问,才能使得1的个数尽量少,且问的问题多呢?

贪心。

C(k,0)个问题,我不提及;C(k,1)个问题,我就只提及一次;C(k,2)个问题,我提及两次........C(k,r)个问题,我提及r次。

这样,最后的矩阵构造是这样的:

0 1 0 0 1 1 ... 1

0 0 1 0 1 0 ... 1

0 0 0 1 0 1 ... 1

. . . . . . ... 1

. . . . . . ... 1

0 0 0 0 0 0 ... 1

然后最后再Check一下整个矩阵的1的个数是否超过k*m,。

于是,这道题就解决了!

有人问,为什么我们只用check总共1的个数是否超过k*m,而不去check每一行的1的个数是否超过m。

其实你去check两个也是可以的,这个复杂度在本题也是可以接受的。

但是为什么呢?

证明如下:

假设我们满足总共1的个数不超过k*m,但是存在某一些位的1的个数超过了m。

那么必然存在一些位的1的个数少于m。

我们选择其中一个超过m的位X,选择其中一个少于m的位Y。

然后我们再从n个串中找到x个在X位为1,Y位为0的串,找到y个在X位中为0,Y位中为1的串。

也是显然知道x>y。

对于x个串,我们都将第X位置成0,Y位置成1,显然这x个串仍然都是各不相同的,且最多在y串中找到一个和他相同的。

因为x>y,所以肯定能够找到一个串是在y串没有与之对应的,那么我们只要变这个串就好了。

这样我们就得到了,X位置的1的总数-1,Y位置的1的总数+1了。

这样总共1的个数是没有变的。

所以只要满足总共1的个数不要超过k*m就好了。

代码

#include<bits/stdc++.h>
using namespace std;
int n,m;
int check(long long k)
{
if(k<=30&&n>(1<<k))return 0;
long long t = 1LL*k*m;
long long N = n;
long long C = 1;
long long ans = 0;
for(int i=0;N>0;i++)
{
long long p = min(C,N);
N-=p;
ans+=p*i;
C = C*(k-i)/(i+1);
//cout<<i<<" "<<N<<" "<<p<<endl;
}
return ans<=t?1:0;
}
int main()
{
scanf("%d%d",&n,&m);
int l = 0,r = n;
int ans = 0;
while(l<=r)
{
int mid = (l+r)/2;
if(check(mid))r=mid-1,ans=mid;
else l=mid+1;
}
cout<<ans<<endl;
}

CDOJ 1277 智商杯考试 每周一题 div2 二分+数学的更多相关文章

  1. CDOJ 1279 班委选举 每周一题 div2 暴力

    班委选举 题目连接: http://acm.uestc.edu.cn/#/status/list?problemId=1279 Description 高考的脚步越来越近了--时间如山涧小溪一般悄无声 ...

  2. CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂 中二版

    "问题:众所周知772002很喜欢马尾,所以他决定画几幅马尾送给他的女朋友. 772002会画m种马尾,772002还有n张纸,n张纸分别编号1到n,每张纸上只能画一种马尾. 然而77200 ...

  3. CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂

    772002画马尾 题目连接: http://acm.uestc.edu.cn/#/problem/show/1280 Description 众所周知772002很喜欢马尾,所以他决定画几幅马尾送给 ...

  4. Java实现UVA10131越大越聪明(蓝桥杯每周一题)

    10131越大越聪明(蓝桥杯每周一题) [问题描述] 一些人认为,大象的体型越大,脑子越聪明.为了反驳这一错误观点,你想要分析一组大象的数据,找出尽量 多的大象组成一个体重严格递增但 IQ 严格递减的 ...

  5. 复旦高等代数 II(17级)每周一题

    本学期将继续进行高等代数每周一题的活动.计划从第一教学周开始,到第十六教学周为止(根据法定节假日安排,中间个别周会适当地停止),每周的周末将公布1道思考题(共16道),供大家思考和解答.每周一题通过“ ...

  6. [问题2014S12] 复旦高等代数II(13级)每周一题(第十二教学周)

    [问题2014S12]  设 \(A,B\) 都是 \(n\) 阶半正定实对称阵, 证明: \(AB\) 的所有特征值都是非负实数. 进一步, 若 \(A,B\) 都是正定实对称阵, 证明: \(AB ...

  7. 复旦高等代数II(18级)每周一题

    本学期将继续进行高等代数每周一题的活动.计划从第一教学周开始,到第十五教学周结束,每周的周末公布一道思考题(预计15道),供大家思考和解答.每周一题将通过“高等代数官方博客”(以博文的形式)和“高等代 ...

  8. RHCSA考试真题

    2018年 RHCSA考试真题... ------------ 考前需要做的基础 破解root密码 KVM虚拟机与VM虚拟机 主机名:station.domain1.example.comIP地址:1 ...

  9. 复旦高等代数 I(17级)每周一题

    本学期将继续进行高等代数每周一题的活动.计划从第二教学周开始,到第十六教学周为止(根据法定节假日安排,中间个别周会适当地停止),每周的周末将公布1-2道思考题,供大家思考和解答.每周一题通过“谢启鸿高 ...

随机推荐

  1. DTW 算法(转)

    DTW为(Dynamic Time Warping,动态时间归准)的简称.应用很广,主要是在模板匹配中,比如说用在孤立词语音识别,计算机视觉中的行为识别,信息检索等中.可能大家学过这些类似的课程都看到 ...

  2. gcc -rpath 指定动态库路径

    gcc -rpath 指定动态库路径 http://blog.csdn.net/v6543210/article/details/44809405

  3. ACE_INET_Addr类 API

    ACE_INET_Addr类,在这个ACE_网络框架中,应该是比较重要的辅助类,该类主要封装了C SOCKET 的地址对象,通过外观封装的模式,把struct sockaddr_in封装在内.方便用户 ...

  4. 关于 拼接 url 连接 参数的问题(爬虫)。

    比如这里 我找的 后台请求的json的链接: 第一页: http://www.igoldenbeta.com:8080/cn-jsfund-server-mobile/bkt/api?appkey=1 ...

  5. BlockingQueue drainTo()

    BlockingQueue BlockingQueue的核心方法:放入数据: offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果Blockin ...

  6. 微信小程序radio组件 - 如何改变默认样式大小?

    今天在写小程序的时候用到radio组件,但是很懊恼并未提供修改radio组件大小属性,第一感觉准备用css width , height 改变radio的大小,但是怎么搞也无法改变. 但是又不愿意搞个 ...

  7. 五十六 SMTP发送邮件

    SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块,email负责构造邮件, ...

  8. Centos7使用squid实现正向代理

    正向代理:代理服务器帮助客户端(浏览器)实现互联网的访问 (1)代理服务器配置 1.安装squid yum install squid -y 2.编辑squid配置文件 #vim /etc/squid ...

  9. 使用for循环打印9×9乘法表

    请使用for循环,倒序打印9×9乘法表. 打印结果如下图所示: 使用for循环打印9×9乘法表 #include <stdio.h> int main() { int i, j, resu ...

  10. CentOS 7.4 下面安装 jdk 10 的一点总结

    CentOS 7.4 下面安装 jdk 10 的一点总结 一.前期工作 1.检验系统原版本 [root@zck ~]# java -version java version "1.7.0_& ...