1060 爱丁顿数
题目:
英国天文学家爱丁顿很喜欢骑车。据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数” E ,即满足有 E 天骑车超过 E 英里的最大整数 E。据说爱丁顿自己的 E 等于87。
现给定某人 N 天的骑车距离,请你算出对应的爱丁顿数 E(≤N)。
输入格式:
输入第一行给出一个正整数 N (≤105),即连续骑车的天数;第二行给出 N 个非负整数,代表每天的骑车距离。
输出格式:
在一行中给出 N 天的爱丁顿数。
输入样例:
1 2 | 10 6 7 6 9 3 10 8 2 7 8 |
输出样例:
1 | 6 |
思路:
1、注意E的值可能是 [0,n]区间内的任何一个数;(被这个卡了很久)
2、求有序数列第一个大于x的元素的位置 (具体参考)
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include<stdio.h> #include<iostream> #include<algorithm> using namespace std; int a[1000005]; int binary( int left, int right, int x){ // 求有序数列第一个大于x的元素的位置 while (left < right){ int mid = left + (right - left) / 2; if (a[mid] > x){ right = mid; } else { left = mid + 1; } } return left; } int main(){ int n,max=0,index; cin>>n; for ( int i=0; i<n; i++){ cin>>a[i]; } sort(a,a+n); for ( int i=0; i<=n; i++){ index = binary(0,n,i); if (n - index >= i && i > max){ max = i; } } cout<<max<<endl; return 0; } |
另一种解法(逆序排序后直接枚举判断 思考正序排序为什么不行?)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> #include <stdlib.h> int cmp( const void *a, const void *b){ return *( int *)b - *( int *)a; } int main(){ int N, E, miles[100000]; scanf ( "%d" , &N); for ( int i = 0; i < N; i++) scanf ( "%d" , miles + i); qsort (miles, N, sizeof ( int ), cmp); for (E = 0; E < N && miles[E] > E + 1; E++) ; printf ( "%d" , E); return 0; } |
分类:
PTA乙级
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现