PAT(Basic Level) Practice : 1060 爱丁顿数 (25分)
1060 爱丁顿数 (25分)
思路
首先想到的肯定是暴力穷举,这肯定超时。
正确思路
爱丁顿数的最大数目就是天数N:即每天骑行数都超过N;最小数目是0,每天都不动。
确定爱丁顿数范围是[N,0]
先进行递减排序
查找骑行数大于N的天数M
判断:
分三种情况
1.M>N 那么爱丁顿数是N
2.M=N 那么爱丁顿是N-1
3.M<N 爱丁顿数未知,但是可以确定的是爱丁顿数必然大于等于M
例如10天,有5天超过了10英里
M=5,N=10.爱丁顿数最小可能是5,因为有5天超过10英里了(必然超过5英里)
更新范围,爱丁顿数范围[N-1,M]
代码
#include <iostream>
#include <vector>
#include <string>
#include <cstdio>
//scanf printf防止超时
#include <algorithm>
//vector的sort
#include <sstream>
//转换
using namespace std;
#include<iomanip>
//精度
#include<cmath>
//round四舍五入取整
bool compare(int n1,int n2)
{
return n1>n2;
}
int main()
{
int num;
cin>>num;
vector<int> nums;
for(int i=0;i<num;i++)
{
int t;
cin>>t;
nums.push_back(t);
}
sort(nums.begin(),nums.end(),compare);
int begin=num;
int end=0;
while(begin>end)
{
int count=0;
for(int i=0;i<nums.size();i++)
{
if(nums[i]>begin)
count++;
}
if(begin<=count)
break;
end=count;
begin--;
}
cout<<begin<<endl;
return 0;
}