【gmoj】 【二分】 Acowdemia
题目
解题思路
二分枚举h
查找是否写k篇综述后有>=h篇论文的被引用次数>=h
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long long n,k,d,l=1,r,a[100010],ans;
bool cmp(int l,int y)
{
return l>y;
}
bool check(int h)
{
long long s=0,m=k*d;
for (int i=1;i<=n;i++)
{
if (a[i]>=h)
{
s++;
continue;
}
if (h-a[i]<=k&&m-(h-a[i])>=0) //每一篇论文只能在每篇综述中出现一次,且不能超过综述一共能包含的论文数
m=m-(h-a[i]),s++;
}
return s>=h;
}
int main()
{
scanf("%lld%lld%lld",&n,&k,&d);
for (int i=1;i<=n;i++)
scanf("%lld",&a[i]);
sort(a+1,a+n+1,cmp);
r=n;
while (l<=r)
{
int mid=(l+r)/2;
if (check(mid))
{
l=mid+1;
ans=mid;
}
else r=mid-1;
}
printf("%lld",ans);
return 0;
}