Codeforces 448 D. Multiplication Table 二分

题目链接:D. Multiplication Table

题意:

  给出N×M的乘法矩阵要你求在这个惩罚矩阵中第k个小的元素(1 ≤ n, m ≤ 5·10^5; 1 ≤ k ≤ n·m).

题解:

  n和m最大都是5e5那矩阵最大就有2e11不能够暴力,其实这里就应该想到要用二分做的,但是我做题的时候脑抽@。@想要推规律,然后就决决了。那么讲一下二分怎么做,就先简单的二分答案在(1-n*m)中二分,然后cheak函数中找所有矩阵中比所给值小的元素,个数大于等于k为成立条件。复杂度(O(n*log(n×m)));

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int MAX_N = 5e5+9;
 4 long long vec[MAX_N];
 5 long long N,M,T;
 6 bool cheak(long long x)
 7 {
 8     long long sum = 0;
 9     for(long long i=1;i<=N;i++)
10     {
11         //cout<<"!!!!!"<<x/i<<endl;
12         sum += min(x/i,M);
13     }
14     if(sum < T)return true;
15     else return false;
16 }
17 int main()
18 {
19 
20     while(cin>>N>>M>>T)
21     {
22         long long l=1,r=N*M;
23         while(l<=r)
24         {
25             long long mid = (l+r)/2;
26             //cout<<"....."<<mid<<endl;
27             if(cheak(mid))
28             {
29                 l = mid+1;
30             }
31             else
32             {
33                 r = mid-1;
34             }
35         }
36         long long ans = l;
37         cout<<ans<<endl;
38     }
39     return 0;
40 }

 

 

转载于:https://www.cnblogs.com/doggod/p/8349413.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值