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;
}

posted @ 2020-09-27 23:36  韩天尊  阅读(109)  评论(0)    收藏  举报