1. 程式人生 > >【PAT乙級】1060 愛丁頓數

【PAT乙級】1060 愛丁頓數

英國天文學家愛丁頓很喜歡騎車。據說他為了炫耀自己的騎車功力,還定義了一個“愛丁頓數” E ,即滿足有 E 天騎車超過 E 英里的最大整數 E。據說愛丁頓自己的 E 等於87。

現給定某人 N 天的騎車距離,請你算出對應的愛丁頓數 E(≤N)。

輸入格式:

輸入第一行給出一個正整數 N (≤10​5​​),即連續騎車的天數;第二行給出 N 個非負整數,代表每天的騎車距離。

輸出格式:

在一行中給出 N 天的愛丁頓數。

輸入樣例:

10

6 7 6 9 3 10 8 2 7 8

輸出樣例:

6

個人理解

這題看似簡單,但是如果方法沒選好真的要耗很久。一開始我是從小到大排序,結果發現不同型別的處理太複雜了,沒法很好地處理好每種情況,解決了一個測試點可能又會影響另一個測試點,所以在參考了

https://www.liuchuo.net/archives/2480這位學姐的部落格後,採用了她的方法,主要思路如下

從下標1開始儲存n天的公里數在陣列a中,對n個數據從大到小排序,i表示了騎車的天數,那麼滿足a[i] > i的最大值即為所求

程式碼實現

#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <iostream>
#define ll long long
#define ep 1e-5
#define INF 0x7FFFFFFF

int const maxn = 100005;

using namespace std;

bool cmp(int a, int b) {
    return a > b;
}

int solve(int nums[], int n) {
    int ans = 0, pos = 1;
    while (nums[pos] > pos && ans <= n) {
        pos ++;
        ans ++;
    }
    return ans;
}

int main() {
    //初始化
    int n, nums[maxn];
    
    //輸入
    cin >> n;
    for (int i = 1; i <= n; i ++) {
        cin >> nums[i];
    }
    
    //從大到小排序
    sort(nums+1, nums+1+n, cmp);
    
    //Calulate
    int ans = solve(nums, n);
    
    //輸出
    cout << ans << endl;
    
    return 0;
}

總結

學習不息,繼續加油

越發覺得自己辣雞,但還是要繼續努力啊!

最後的最後,放一份從小到大排序的程式碼,尚未AC

#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <iostream>
#define ll long long
#define ep 1e-5
#define INF 0x7FFFFFFF

int const maxn = 100005;

using namespace std;

bool cmp(int a, int b) {
    return a > b;
}

int solve(int nums[], int n) {
    int ret = 0;
    if (nums[n-1] ==  1) {
        return ret;
    }
    else if (n == 1) {
        ret = 1;
        return ret;
    }
    else {
        for (int i = 0; i < n; i ++) {
            int bigger_days = n - i - 1;
            int tmp_ret = 0;
            if (bigger_days < nums[i]) {
                tmp_ret = bigger_days;
            }
            if (tmp_ret > ret)
                ret = tmp_ret;
        }
        return ret;
    }
}

int main() {
    //初始化
    int n, nums[maxn];
    
    //輸入
    cin >> n;
    for (int i = 0; i < n; i ++) {
        cin >> nums[i];
    }
    
    //從小到大排序
    sort(nums, nums+n);
    
    //Calulate
    int ans = solve(nums, n);
    
    //輸出
    cout << ans << endl;
    
    return 0;
}