P7557 [USACO21OPEN] Acowdemia S
题目描述
由于对计算机科学的热爱,以及有朝一日成为 「Bessie 博士」的诱惑,奶牛 Bessie 开始攻读计算机科学博士学位。经过一段时间的学术研究,她已经发表了 NNN 篇论文(1≤N≤1051 \leq N \leq 10^51≤N≤105),并且她的第 iii 篇论文得到了来自其他研究文献的 cic_ici 次引用(0≤ci≤1050 \leq c_i \leq 10^50≤ci≤105)。
Bessie 听说学术成就可以用 hhh 指数来衡量。hhh 指数等于使得研究员有至少 hhh 篇引用次数不少于 hhh 的论文的最大整数 hhh。例如,如果一名研究员有 444 篇论文,引用次数分别为 (1,100,2,3)(1,100,2,3)(1,100,2,3),则 hhh 指数为 222,然而若引用次数为 (1,100,3,3)(1,100,3,3)(1,100,3,3) 则 hhh 指数将会是 333。
为了提升她的 hhh 指数,Bessie 计划写至多 KKK 篇综述(0≤K≤1050 \leq K \leq 10^50≤K≤105),并在每篇综述中引用许多她曾经写过的论文。然而,由于页数限制,她至多可以在一篇综述中引用 LLL 篇论文(0≤L≤1050 \leq L \leq 10^50≤L≤105)。当然,一篇综述中她只能引用一篇论文至多一次(但是一篇论文可以在多篇综述中被引用)。
请帮助 Bessie 求出在写完这些综述后她可以达到的最大 hhh 指数。Bessie 不可以在一篇综述中引用她写的其他综述。
注意 Bessie 的导师可能会告知她纯粹为了提升 hhh 指数而写综述存在违反学术道德的嫌疑;我们不建议其他学者模仿 Bessie 的行为。
输入格式
输入的第一行包含 NNN、KKK 和 LLL。
第二行包含 NNN 个空格分隔的整数 c1,…,cNc_1,\ldots, c_Nc1,…,cN。
输出格式
输出最大可以达到的 hhh 指数。
输入输出样例 #1
输入 #1
4 4 1
1 100 1 1
输出 #1
3
说明/提示
样例说明
在这个样例中,Bessie 可以写至多一篇综述。如果 Bessie 引用她的第一、第三、第四篇论文中的任意一篇,她的 hhh 指数会变为 222。
测试点性质:
- 测试点 1∼61 \sim 61∼6 满足 N≤100N\le 100N≤100。
- 测试点 7∼167 \sim 167∼16 没有额外限制。
说明
供题:Dhruv Rotation
C++实现
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,a[2000005],x,ans,k,l,qzh[200005],m,o;
bool cmp(ll ai,ll bi){
return ai>bi;
}
int main(){
cin>>n>>k>>l;
if(l>n)l=n;//特判l大于n时则多余的为无意义要舍去
m=k*l;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
sort(a+1,a+1+n,cmp);//排序数列保证其有单调性(从小到大)
for(int i=1;i<=n;i++){
qzh[i]=qzh[i-1]+a[i];
}//求前缀和
for(int i=1;i<=n;i++){//从小到大枚举h
if(a[i]<i){
for(;a[o]<i&&o;o--){} //求大于h的数有哪些
if(i*(i-o)-qzh[i]+qzh[o]<=m&&i-a[i]<=k){//判断操作是否够
ans=i;//更新ans即最大的h指数。
}
}
else {
ans=i;//更新ans在无需操作时最大的h指数。
o=i;//记录>h的个数
}
}
cout<<ans;
return 0;
}
后续:
接下来我会不断用C++来实现信奥比赛中的算法题、C++考级编程题实现、白名单赛事考题实现,感兴趣的请关注,我后续将继续分享相关内容