欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

cf448D Multiplication Table 二分

发布时间:2023/10/18 编程问答 88 如意码农
生活随笔 收集整理的这篇文章主要介绍了 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 二分的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。