题目描述
知识点
思维题
实现
码前思考
- 注意
E
表示的是存在E
天使得这E
天中每天的骑行量都大于E
即可,因此骑行量大于E
的天数可以是多于E
的。(理解一下) - 我们先对数组从小到大排序;
- 然后从最大的值开始枚举
E
的大小,从1开始; - 因为是存在
E
,所以我们只要保证当前最大的前E
个数大于E
就可以了,因为只要它们满足就一定满足,它们不满足那么一定不会满足!这是很巧妙的一个思想! - 我也是通过测试用例发现的;
代码实现
//使用排序进行解决
#include "bits/stdc++.h"
using namespace std;
const int maxn = 1e5+10;
int n;
int d[maxn];
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&d[i]);
}
sort(d,d+n);
//从最后一位开始
int e;
for(e=1;e<=n;e++){
int pos = n-e;
if(d[pos] > e){ //如果当前数组的位置大于这个e
//那么继续
continue;
}else{
break;
}
}
printf("%d\n",e-1);
return 0;
}
码后思考
- 柳神的写法跟我的写法差不多。
- 这个题主要还是在思维。
二刷代码
二刷的时候完全心不在焉,忽视了很多的条件。。。这不行啊。。。(可能是没书读,太焦虑了
//先排序,然后选择继承
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5+10;
int n;
int data[maxn];
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&data[i]);
}
sort(data,data+n);
int ans=1;
for(;ans<=n;ans++){
int pos=n-ans;
if(data[pos]>ans){
continue;
}else{
break;
}
}
printf("%d\n",ans-1);
return 0;
}