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

PAT 乙級 1060 愛丁頓數

1060 愛丁頓數 (25 point(s))

英國天文學家愛丁頓很喜歡騎車。據說他為了炫耀自己的騎車功力,還定義了一個“愛丁頓數” 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

 經驗總結:

首先,明確一點,愛丁頓數的意思,即滿足有 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;
}