上次考乙级时的真题,先假设E为N,寻找超过N公里的天数n,
如果n大于等于E,输出;
如果n小于E,明显只有E缩小到剩余公里数最大值(x)-1,才可以让n增加
n不增加的情况,判断E缩小到n的情况,此时n天超过n公里是成立的,如果n比x-1要大,输出
否则E降到x-1,n继续增大
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int N;
cin >> N;
if (N == 0) { cout << 0<< endl;exit(0); }
vector<int> all(N);
for (int t = 0;t < N;t++)
cin >> all[t];
sort(all.rbegin(), all.rend());//从大到小排序
int E = N;
int n = 0;
for (auto x : all)
{
if (x <= E)//目前有n天是超过E公里的
{
if (n >= E)break;//判断
if (n >= x - 1) {//如果E取n是绝对成立的
E = n;break;
}
E = x - 1;//继续求有多少天超过E公里的
}
n++;
}
cout << E << endl;
}