1060 爱丁顿数

题意比较难理解,

换句话说 ,就是统计 骑车超过 0公里的 天数 x, 超过 1公里的天数 y,超过 2公里的天数 z,依次类推。。。。

最后找出 骑车天数大于等于 骑车距离,并且骑车距离最远  的骑车天数,好绕啊。。。直接看下面的样例分析吧。。。

 分析题目给的样例。

对 10 天的骑车距离按递增排序为 2 3 6 6 7 7 8 8 9 10

0.骑车超过0公里的天数是 10;

1.骑车超过1公里的天数是 10;

2,骑车超过2公里的天数是 9;

3.骑车超过3公里的天数是 8;

4.骑车超过4公里的天数是 8;

5.骑车超过5公里的天数是 8;

6.骑车超过6公里的天数是 6;

7.骑车超过7公里的天数是 4;

8.骑车超过8公里的天数是 2;

9.骑车超过9公里的天数是 1;

10.骑车超过10公里的天数是 0;

从第10条往前看,最后只有第6条满足,骑车天数6大于等于骑车距离6,并且最大骑车距离是6。那么 6即为答案。

#include<iostream>
#include<algorithm>
using namespace std;

int a[100010];
int table[100010] = {0};
int main() {
    int n;
    cin>>n;
    for(int i = 0; i < n; ++i)
        scanf("%d",&a[i]);//存放骑车距离 
    sort(a,a+n);
    int MAX = a[n-1];//最远骑车距离 
    table[0] = n;//骑车超过0公里的天数是 n
    for(int i = 1,j = 0; i <= MAX; ++i) {// i 表示距离 
        if(i < a[j]) {
            table[i] = table[i-1];
            continue;
        }
        while(j < n && a[j] <= i) ++j;
        table[i] = n-j;
    }
    for(int i = MAX; i >= 0 ; --i)// 0~最大骑车距离MAX都要考虑到。。不然测试点4过不去。
        if(table[i] - i >= 0) {
            cout<<i;
            break;
        }
    return 0;
}

 

 记得第一次做这道题时,很快就AC了,那天高兴死我了。。。

 做这道题和做B1045 快速排序 给我的感觉差不多,都要进行递推。

posted @ 2020-02-23 16:08  tangq123  阅读(175)  评论(0编辑  收藏  举报