1. 程式人生 > >PAT 乙級 1059 C語言競賽

PAT 乙級 1059 C語言競賽

1059 C語言競賽 (20 point(s))

C 語言競賽是浙江大學計算機學院主持的一個歡樂的競賽。既然競賽主旨是為了好玩,頒獎規則也就制定得很滑稽:

  • 0、冠軍將贏得一份“神祕大獎”(比如很巨大的一本學生研究論文集……)。
  • 1、排名為素數的學生將贏得最好的獎品 —— 小黃人玩偶!
  • 2、其他人將得到巧克力。

給定比賽的最終排名以及一系列參賽者的 ID,你要給出這些參賽者應該獲得的獎品。

輸入格式:

輸入第一行給出一個正整數 N(≤10​4​​),是參賽者人數。隨後 N 行給出最終排名,每行按排名順序給出一位參賽者的 ID(4 位數字組成)。接下來給出一個正整數 K 以及 K 個需要查詢的 ID。

輸出格式:

對每個要查詢的 ID,在一行中輸出 ID: 獎品,其中獎品或者是 Mystery Award(神祕大獎)、或者是 Minion(小黃人)、或者是 Chocolate(巧克力)。如果所查 ID 根本不在排名裡,列印 Are you kidding?(耍我呢?)。如果該 ID 已經查過了(即獎品已經領過了),列印 ID: Checked(不能多吃多佔)。

輸入樣例:

6
1111
6666
8888
1234
5555
0001
6
8888
0001
1111
2222
8888
2222

輸出樣例:

8888: Minion
0001: Chocolate
1111: Mystery Award
2222: Are you kidding?
8888: Checked
2222: Are you kidding?

經驗總結:

這一題,不是很難,主要是要把思路理清,注意點有以下幾個:
1. 未記錄的id,輸出相應的結果。
2. 查詢過一次的ID,輸出指定結果
3. 第一名,特判
4. 質數名,特判
5. 不滿足3和4的排名,輸出相應結果。
方法就是利用hash表就可以了,感覺還可以,就是判斷有些複雜啦~(..•˘_˘•..)

AC程式碼

#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=100010;
bool f[maxn]={false};
bool isprime(int x)
{
	if(x<=1) return false;
	int sqr=(int)sqrt(x*1.0);
	for(int i=2;i<=sqr;++i)
		if(x%i==0)
			return false;
	return true;
}
int main()
{
	int n,m,flag[maxn];
	while(~scanf("%d",&n))
	{
		memset(flag,0,sizeof(flag));
		for(int i=1;i<=n;++i)
		{
			scanf("%d",&m);
			flag[m]=i;
		}
		scanf("%d",&n);
		for(int i=0;i<n;++i)
		{
			scanf("%d",&m);
			if(flag[m]==0)
				printf("%04d: Are you kidding?\n",m);
			else if(flag[m]==1)
			{
				printf("%04d: Mystery Award\n",m);
				flag[m]=-1;
			}
			else if(flag[m]==-1)
			{
				printf("%04d: Checked\n",m);
			}
			else if(flag[m]!=0&&isprime(flag[m])==true)
			{
				printf("%04d: Minion\n",m);
				flag[m]=-1;
			}
			else if(flag[m]!=0)
			{
				printf("%04d: Chocolate\n",m);
				flag[m]=-1;
			}
		}
	}
	return 0;
}