CCPC2018-湖南全国邀请赛 HDU6276 Easy h-index【二分法】

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

CCPC2018-湖南全国邀请赛-重现赛(感谢湘潭大学)

 

题意

给定长度为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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值