codeforces Round 256(Div.2)D.Multiplication Table(二分)
- 题目链接
- 题目大意:从n*m的乘法表中,找出第k大的数
- 解题思路:开始完全没想到是二分,然后看了题解,发现就是二分去找那个数。具体操作过程就是让left=1,right=n*m,然后二分得到一个mid,然后去看mid是第几大的数。这里有个我觉得很巧妙的地方就是mid直接去跟乘法表的末尾数字去比大小就好了,如果末尾数字比较小那么直接加m就好,如果mid的比较小mid在这一行的位置就是mid/i(i是行号),体会一下
- AC
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
long long n,m,k;
int check(long long a)
{
long long i,j,ord=0,t;
for(i=1;i<=n;i++)
{
t=min(i*m,a);
ord+=t/i;
}
if(ord<k)
return 0;
else
return 1;
}
int main()
{
long long l,r,mid;
scanf("%lld %lld %lld",&n,&m,&k);
l=1;
r=n*m;
while(r-l>1)
{
mid=(l+r)/2;
if(check(mid)==1)
r=mid;
else if(check(mid)==0)
l=mid;
}
if(check(l)==1)
printf("%lld",l);
else
printf("%lld",r);
return 0;
}