CF#256D:http://codeforces.com/contest/448/problem/D
题意:给你一个n*m的表格,第i行第j列的数据是i*j,然后询问第k小的数,这里的排序是不去重的。
题解:二分,每次判断当前的数是第几大,然后与k进行比较。这里统计这个数是第几大,要for一遍,一开始不知道怎么统计,看了别人的知道自己傻了。这里二分的时候不用判断这个数是否在这个表中,为什么不用,自己要好好体会。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 #include<map> 7 #include<set> 8 using namespace std; 9 long long n,m; 10 long long k; 11 bool judge(long long x){ 12 long long ans=0,tmp; 13 for(long long i=1;i<=n;i++){ 14 tmp=min(i*m,x); 15 ans+=tmp/i; 16 } 17 return ans<k; 18 } 19 int main(){ 20 while(~scanf("%I64d%I64d%I64d",&n,&m,&k)){ 21 long long l=1,r=n*m; 22 while(l<r){ 23 long long mid=(l+r)/2; 24 if(judge(mid))l=mid+1; 25 else r=mid; 26 } 27 printf("%I64d ",r); 28 } 29 }