PAT 乙級 1060 愛丁頓數
阿新 • • 發佈:2019-01-11
1060 愛丁頓數 (25 point(s))
英國天文學家愛丁頓很喜歡騎車。據說他為了炫耀自己的騎車功力,還定義了一個“愛丁頓數” 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
經驗總結:
首先,明確一點,愛丁頓數的意思,即滿足有 E 天騎車超過 E 英里的最大整數 E,就是說超過E公里的天數X>=E,並不止是X==E,這一點明確了,剩下的就是,第四個測試點的超時問題,以及第五個測試點的關於0公里的邊界處理問題了。
第四個測試點的超時問題,是因為我原本的思路,是利用flag[]陣列,對於輸入的公里數m,將flag[1]~flag[m-1]全部都加1,然後從N天至0天依次查詢,如果flag[i]>=i,則輸出i,並中斷迴圈。但是這種思路會超時的,之後,我利用如下AC程式碼的思路,化解了超時問題,就是對於輸入的m,只將flag[m]加1,然後從maxn-1~n-1計算所有大於n的公里的個數,之後再依次從N~0依次訪問,不過每次訪問判斷之後,都要再加上flag[i],即公里數為i的個數。
第五個測試點關於0的處理,就很簡單了,迴圈邊界寫為0再跳出就行啦~(。→‿←。)
AC程式碼
#include <cstdio> #include <cstring> #include <cmath> using namespace std; const int maxn=100010; int main() { int n,m,flag[maxn]; while(~scanf("%d",&n)) { memset(flag,0,sizeof(flag)); for(int i=0;i<n;++i) { scanf("%d",&m); int lim=m<maxn-1?m:maxn-1; ++flag[lim]; } int num=0; for(int i=maxn-1;i>n;--i) num+=flag[i]; for(int i=n;i>=0;--i) { if(num>=i) { printf("%d\n",i); break; } num+=flag[i]; } } return 0; }