Easy h-index
http://acm.hdu.edu.cn/showproblem.php?pid=6276
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2041 Accepted Submission(s): 649
Problem Description
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 ai papers with citations exactly i, find the h-index of Bobo.
Input
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.
Output
For each test case, print an integer which denotes the result.
## Constraint
* 1≤n≤2⋅10^5
* 0≤ai≤10^9
* The sum of n does not exceed 250,000.
Sample Input
1
1 2
2
1 2 3
3
0 0 0 0
Sample Output
1
2
0
Source
题意
给定长度为n+1的数组a[],a[i]=j表示等于i的数有j个,求最大的h,h满足值大于等于h的数的个数要不少于h个。
思路
求a[]的后缀和,这样a[i]就表示大于等于i的数有a[i]个,然后使用二分查找。
C++代码
#include<iostream>
using namespace std;
const int N=200005;
typedef long long ll;
ll a[N];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=n-1;i>=0;i--)//求后缀和
a[i]+=a[i+1];
int l=0,r=n;//二分查找答案
while(l<=r)
{
int mid=(l+r)>>1;
if(a[mid]<mid)
r=mid-1;
else
l=mid+1;
}
printf("%d\n",l-1);
}
return 0;
}