P7557 [USACO21OPEN] Acowdemia S题解
[USACO21OPEN] Acowdemia S
题目描述
由于对计算机科学的热爱,以及有朝一日成为 「Bessie 博士」的诱惑,奶牛 Bessie 开始攻读计算机科学博士学位。经过一段时间的学术研究,她已经发表了 N N N 篇论文( 1 ≤ N ≤ 1 0 5 1 \leq N \leq 10^5 1≤N≤105),并且她的第 i i i 篇论文得到了来自其他研究文献的 c i c_i ci 次引用( 0 ≤ c i ≤ 1 0 5 0 \leq c_i \leq 10^5 0≤ci≤105)。
Bessie 听说学术成就可以用 h h h 指数来衡量。 h h h 指数等于使得研究员有至少 h h h 篇引用次数不少于 h h h 的论文的最大整数 h h h。例如,如果一名研究员有 4 4 4 篇论文,引用次数分别为 ( 1 , 100 , 2 , 3 ) (1,100,2,3) (1,100,2,3),则 h h h 指数为 2 2 2,然而若引用次数为 ( 1 , 100 , 3 , 3 ) (1,100,3,3) (1,100,3,3) 则 h h h 指数将会是 3 3 3。
为了提升她的 h h h 指数,Bessie 计划写至多 K K K 篇综述( 0 ≤ K ≤ 1 0 5 0 \leq K \leq 10^5 0≤K≤105),并在每篇综述中引用许多她曾经写过的论文。然而,由于页数限制,她至多可以在一篇综述中引用 L L L 篇论文( 0 ≤ L ≤ 1 0 5 0 \leq L \leq 10^5 0≤L≤105)。当然,一篇综述中她只能引用一篇论文至多一次(但是一篇论文可以在多篇综述中被引用)。
请帮助 Bessie 求出在写完这些综述后她可以达到的最大 h h h 指数。Bessie 不可以在一篇综述中引用她写的其他综述。
注意 Bessie 的导师可能会告知她纯粹为了提升 h h h 指数而写综述存在违反学术道德的嫌疑;我们不建议其他学者模仿 Bessie 的行为。
输入格式
输入的第一行包含 N N N、 K K K 和 L L L。
第二行包含 N N N 个空格分隔的整数 c 1 , … , c N c_1,\ldots, c_N c1,…,cN。
输出格式
输出最大可以达到的 h h h 指数。
样例 #1
样例输入 #1
4 4 1
1 100 1 1
样例输出 #1
3
提示
样例说明
在这个样例中,Bessie 可以写至多一篇综述。如果 Bessie 引用她的第一、第三、第四篇论文中的任意一篇,她的 h h h 指数会变为 2 2 2。
测试点性质:
- 测试点 1 ∼ 6 1 \sim 6 1∼6 满足 N ≤ 100 N\le 100 N≤100。
- 测试点 7 ∼ 16 7 \sim 16 7∼16 没有额外限制。
说明
供题:Dhruv Rohatgi
题解
题意分析:
首先,本题要求的是h 指数,可以用二分答案来做,最大里找最小。 当然在二分之前,先要把题中的c 数组排序。
现在关键就是 check 函数的问题。
我们可以定义一个变量s,来表示需要引用的论文数量;
循环1 到 n,计算还需引用几次第i 篇论文几次;
若引用次数大于题目中的K,则直接返回0,说明该答案不可行;
循环结束后判断 s 是否大于论文引用次数上限,若大于,返回 0,若小于或等于,返回 1。
#include<bits/stdc++.h>
using namespace std;
long long n,m,k,a[100010];//最好用 long long,反正内存不会超bool check(int x){long long s=0;for(int i=1;i<=n;i++){if(a[i]<x){s+=x-a[i];if(x-a[i]>m) return 0;}if(s>m*k) return 0;if(i==x) return 1;}
}//判断函数,二分中最关键的部分bool cmp(const int &x,const int &y){return x>y;
}int main(int argc, const char * argv[]){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>m>>k;for(int i=1;i<=n;i++){cin>>a[i];}sort(a+1,a+1+n,cmp);//快排函数int l=0,r=n;while(l<r){int mid=(l+r+1)/2;if(check(mid)) l=mid;else r=mid-1;}//二分模板cout<<l<<"\n";return 0;
}
//Written by Kevin ☑