题目
思路
-
从小到大排序,暴力破解会超时。
此时通过比较每天骑行的公里数,与剩余的天数来判断。
当第i天骑行的公里数a[i]大于剩余天数n-i时,n-i天即为最大E值。 -
通过降序排列,从1开始编号,a【1】为最后一天骑行公里数,此时编号的1为骑行超过该天公里数的天数。
通过判断a【i】> i 来记录E。(此处代码思路参考柳神)
AC代码
- 升序排列
#include<bits/stdc++.h>
using namespace std;
int main(){
int n; cin>>n;
int a[n]={0},day[n]={0};
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
int E =0;
for(int i=0;i<n;i++)
{
if(a[i]>n-i)//a[i]是该天骑了公里数,在排序后,n-i就表示后续项数,第一个E为最大的E值
{
E=n-i;
break;
}
}
cout<<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;
}