【PAT乙級】1060 愛丁頓數
阿新 • • 發佈:2018-12-17
英國天文學家愛丁頓很喜歡騎車。據說他為了炫耀自己的騎車功力,還定義了一個“愛丁頓數” E ,即滿足有 E 天騎車超過 E 英里的最大整數 E。據說愛丁頓自己的 E 等於87。
現給定某人 N 天的騎車距離,請你算出對應的愛丁頓數 E(≤N)。
輸入格式:
輸入第一行給出一個正整數 N (≤105),即連續騎車的天數;第二行給出 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; }