1117 Eddington Number (25 point(s))
British astronomer Eddington liked to ride a bike. It is said that in order to show off his skill, he has even defined an "Eddington number", E -- that is, the maximum integer E such that it is for E days that one rides more than E miles. Eddington's own E was 87.
Now given everyday's distances that one rides for N days, you are supposed to find the corresponding E (≤N).
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤105), the days of continuous riding. Then N non-negative integers are given in the next line, being the riding distances of everyday.
Output Specification:
For each case, print in a line the Eddington number for these N days.
Sample Input:
10
6 7 6 9 3 10 8 2 7 8
Sample Output:
6
H-Index算法。
最开始的思路是哈希思想,但是如果有数字大于1e5就不可以了。
仔细一看,这就是H-Index的求法,即H篇被引量超过N的论文。
首先降序排序,以上面的例子来看:10 9 8 8 7 7 6 6 3 2。以下标为1位置为例,表示有1篇被引超过9的论文;以下标4为例,表示有2篇被引超过7的论文,但也可以表示成有3篇被引大于6(7-1)的论文,这样到这个下标位置H至少是3了。只要当前的篇数不大于当前最低的下界(不含),就可以循环继续。注意在下标i的位置(0<=i<N)是对前i个元素进行的判断,因此最后还需要判断H是否可以是N。
相关链接:https://blog.youkuaiyun.com/richenyunqi/article/details/79764568
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAX = 1e5+7;
int a[MAX]={0};
bool comp(const int &a,const int &b)
{
return a>b;
}
int main(void){
int N;cin>>N;
for(int i=0;i<N;i++) cin>>a[i];
sort(a,a+N,comp);
int cnt;
int ans =0; int max;
for(int i=0;i<N;i++){
if(i==0||a[i]!=a[i-1]){
cnt=i;
max = a[i];
}//前面有cnt个元素大于a[i]的元素
else if(a[i]==a[i-1]){
cnt = i;
max = a[i]-1;
}//前面有cnt个大于a[i-1]的元素
if(cnt<=max){//有cnt个大于a[i]的元素
ans=cnt;
}
else break;
}
if(a[N-1]>N) ans=N;
cout<<ans<<endl;
return 0;
}