题目
英国天文学家爱丁顿很喜欢骑车。据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数” E ,即满足有 E 天骑车超过 E 英里的最大整数 E。据说爱丁顿自己的 E 等于87。
现给定某人 N 天的骑车距离,请你算出对应的爱丁顿数 E(≤N)。
输入格式:
输入第一行给出一个正整数 N (≤10^5),即连续骑车的天数;第二行给出 N 个非负整数,代表每天的骑车距离。
输出格式:
在一行中给出 N 天的爱丁顿数。
输入样例:
10
6 7 6 9 3 10 8 2 7 8
输出样例:
6
自己分析
首先根据自己的理解是这样的,令E从n开始递减,然后遍历数组a,如果超过E则cnt++。因为E是从大到小,所以一旦出现cnt==E则直接输出。
但是,参考这位博主的解读,自己这样的思路就不对了
样例来分析,先从大到小排序 10 9 8 8 7 7 6 6 3 2,提取关键词是超过E英里天数大于E,E并不一定是数组里面的数字,比如5,大于5有8天,那么5也是爱丁顿数的候选了。
17分题解
# include <bits/stdc++.h>
using namespace std;
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,cnt=0;
cin>>n;
vector<int> a(n);
for(int i=0; i<n; i++)
cin>>a[i];
for(int i=n; i>=1; i--)
{
for(int j=0; j<n; j++)
{
if(a[j]>i)
{
cnt++;
}
}
if(cnt==i) {
cout<<cnt<<endl;
break;
}
cnt=0;
}
return 0;
}
柳神分析
从下标1开始存储n天的公里数在数组a中,对n个数据从大到小排序,i表示了骑车的天数,那么满足a[i] > i的最大值即为所求~
10 9 8 8 7 7 6 6 3 2
>
1 2 3 4 5 6 7 8 9 10
题目满足有 E 天骑车超过 E 英里的最大整数 E
这里的E既是天数也是公里数,所以可以理解为上面的下标就是公里,一旦不满足>的关系,那么前一个就是要输出的值了。
柳神题解
#include <iostream>
#include <algorithm>
using namespace std;
int a[1000000];
bool cmp1(int a, int b) {
return a > b;
}
int main() {
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
sort(a+1, a+n+1, cmp1);
int ans = 0, p = 1;
while(ans <= n && a[p] > p) {
ans++;
p++;
}
printf("%d", ans);
return 0;
}