2021.8.14提高B组模拟6T2 + P7557 [USACO21OPEN] Acowdemia (二分)
Posted SSL_LKJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021.8.14提高B组模拟6T2 + P7557 [USACO21OPEN] Acowdemia (二分)相关的知识,希望对你有一定的参考价值。
Acowdemia
题目大意
输入样例
1.
4 4 1
1 100 1 1
2.
4 1 4
1 100 1 1
输出样例
输出最大可以达到的 h指数。
1.
3
2.
2
题目数据
题目提示
样例1,在这个样例中,Bessie 可以写至多 4 篇综述,每篇引用至多 1 篇论文。如果她引用她的第一篇和第三篇论文各两次,则她的 h 指数会变为 3。
样例2,在这个样例中,Bessie 可以写至多一篇综述。如果 Bessie 引用她的第一、第三、第四篇论文中的任意一篇,她的 h 指数会变为 2。
解题思路
先将数据从大到小排序
就满足了单调性,可以用二分查找答案
check(判断)是否合法
AC代码
#include<algorithm>
#include<cstdio>
using namespace std;
int n,k,ll,l,r=100000,answer,a[100005];
bool cmp(int x,int y)
{
return x>y;
}
bool check(int x)//判断是否合法
{
long long ans=0;
for(int i=1;i<=x;i++)
if(a[i]<x)//如果不满x
{
if(x-a[i]>k)return false;//相差的值还大于最多要写的论文数,就不合法
ans+=1ll*(x-a[i]);//累加需要多少引用
if(ans>1ll*k*1ll*ll)return false;//如果引用数还大于最多可以引用的数量,自然不合法
}
return true;
}
int main()
{
scanf("%d%d%d",&n,&k,&ll);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1,cmp);//大到小排序
while(l<=r)//二分
{
int mid=(l+r)/2;
if(check(mid))l=mid+1,answer=mid;
else r=mid-1;
}
printf("%d",answer);
return 0;
}
谢谢
以上是关于2021.8.14提高B组模拟6T2 + P7557 [USACO21OPEN] Acowdemia (二分)的主要内容,如果未能解决你的问题,请参考以下文章
2021.8.14提高B组模拟6T4 + P7555 [USACO21OPEN] Maze Tac Toe (dfs)
2021.8.14提高B组模拟6T4 + P7555 [USACO21OPEN] Maze Tac Toe (dfs)
2021.8.14提高B组模拟6T3 + P7527 [USACO21OPEN] United Cows of Farmer John (树状数组)
2021.8.14提高B组模拟6T3 + P7527 [USACO21OPEN] United Cows of Farmer John (树状数组)