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