1060 爱丁顿数 (25 分)

题目:1060 爱丁顿数 (25 分)

英国天文学家爱丁顿很喜欢骑车。据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数” E ,即满足有 E 天骑车超过 E 英里的最大整数 E。据说爱丁顿自己的 E 等于87。

现给定某人 N 天的骑车距离,请你算出对应的爱丁顿数 E(≤)。

输入格式:

输入第一行给出一个正整数 N (≤),即连续骑车的天数;第二行给出 N 个非负整数,代表每天的骑车距离。

输出格式:

在一行中给出 N 天的爱丁顿数。

输入样例:

10
6 7 6 9 3 10 8 2 7 8

输出样例:

6

思路:

  • 读懂题目真的很重要,不然就会像我一样,案例输进去跑出的结果是一样的,但是一个测试点都过不了QAQ。
  • 题目想表达的是:第一天骑车距离超过1,则E就是1,第二天超过2,那E就是2了,第三天没超过3,那E还是2.(可能就是我理解力不好T^T,理解成另一个意思了我……)
    案例输入的十天里,有六天满足这种情况,所以输出6 。注意:是超过!!不能等于。还算上等于的情况就只能过测试点0和2了。
  • 按降序排序后判断和无序直接判断是差不多的,相比之下排完序后判断更好一点,因为一旦判到小于等于的情况就可以直接break,然后输出计数结果。
    直接按这种无序判断的话测试点5会答案错误,应该是边界处没处理好,或者需要特判???(没试。想这么做的可以试试)

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cctype>
 4 #include <iostream>
 5 #include <sstream>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <string>
 9 #include <stack>
10 #include <queue>
11 #include <vector>
12 #include <map>
13 using namespace std;
14 
15 int cmp(int a, int b)
16 {
17     return a > b;
18 }
19 
20 int main()
21 {
22     int n, e[100005];
23     scanf("%d", &n);
24     for(int i = 0; i < n; i++)
25     {
26         scanf("%d", &e[i]);
27     }
28     sort(e, e + n, cmp);
29     int sum = 0;
30     for(int i = 0; i < n; i++)
31     {
32         if(e[i] > i+1)
33             sum++;
34         else
35             break;
36     }
37     printf("%d\n", sum);
38     return 0;
39 }

 

总结:

  读懂读对题目是做题的开始。不然无法下手。

转载于:https://www.cnblogs.com/Anber82/p/11408472.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值