A.Easy h-index
题目描述
The h-index of an author is the largest h where he has at least h papers with citations not less than h.
Bobo has published many papers. Given a0, a1, a2 ,..., an which means Bobo has published a i papers with citations exactly i , find the h-index of Bobo.
Bobo has published many papers. Given a0, a1, a2 ,..., an which means Bobo has published a i papers with citations exactly i , find the h-index of Bobo.
输入
The input consists of several test cases and is terminated by end-of-file.
The first line of each test case contains an integer n . The second line contains ( n + 1) integers a0 , a1 , ... , an .
The first line of each test case contains an integer n . The second line contains ( n + 1) integers a0 , a1 , ... , an .
输出
For each test case, print an integer which denotes the result.
• 1 ≤ n ≤ 2 · 105
• 0 ≤ ai ≤ 109
• The sum of n does not exceed 250,000.
样例输入
1
1 2
2
1 2 3
3
0 0 0 0
样例输出
1 2 0
题意:给定被引用次数为0~n的论文分别有几张,找到最大的h,满足被引用次数大于等于h的论文至少有h张
思路:在区间[0,n]内二分答案;或直接从n~0遍历找到第一个满足条件的h
AC代码:
#include <iostream> #include<cstdio> #include<algorithm> typedef long long ll; using namespace std; ll n; ll a[200010]; bool ok(ll x){ ll cnt=0;//cnt的值可能会爆int for(ll i=0;i<=n;i++) if(i>=x) cnt+=a[i]; if(cnt>=x) return true; return false; } int main() { while(cin>>n){ for(ll i=0;i<=n;i++){ cin>>a[i]; } ll l=0,r=n; while(l<=r){ ll mid=(l+r)/2; if(ok(mid)) l=mid+1; else r=mid-1; } cout<<r<<endl; } return 0; }