Multiplication Table

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\n",r);
28    }
29 }
View Code

posted on 2014-07-18 13:50  天依蓝  阅读(521)  评论(0编辑  收藏  举报

导航