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 (树状数组)

2017.12.09NOIP提高组模拟赛A组

2017.07.16【NOIP提高组】模拟赛B组 卫星照片 题解