cf448D Multiplication Table 二分
生活随笔
收集整理的这篇文章主要介绍了
cf448D Multiplication Table 二分
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
题目:http://codeforces.com/problemset/problem/448/D
题意:给出n,m,k,即在一个n*m的二维数组中找第k大的数,第i行第j列的数的值为i*j。
思路:二分答案,每一行中找比它小的数之和(单调函数),作为check的条件来转移。
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long k;
bool check(long long mid)
{
long long res=;
for(int i=;i<=n;i++)
{
res+=min(mid/i,1ll*m);
}
if(res>=k)return ;
return ;
}
int main()
{
scanf("%d%d%lld",&n,&m,&k);
long long l=,r=1ll*n*m,ans=-;
while(l<=r)
{
long long mid=l+r>>;
if(check(mid))
{
ans=mid;
r=mid-;
}
else l=mid+;
}
printf("%lld\n",ans);
return ;
}
总结
以上是生活随笔为你收集整理的cf448D Multiplication Table 二分的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 这样看C函数才对
- 下一篇: 秀++视频算法仓库-厂家对接规约V5