PAT-B 1059 C語言競賽【模擬】

Enjoy_process發表於2019-02-25

                                                   PAT-B 1059 C語言競賽

                            https://pintia.cn/problem-sets/994805260223102976/problems/994805269828059136

 

 

題目

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?

分析

模擬題,具體細節看程式,註釋比較清楚。

C++程式

#include<iostream>
#include<map>

using namespace std;

const int N=10005;

bool prime[N];//prime[i]記錄i是否為素數

//素數篩選 
void maketable(int n)
{
	for(int i=2;i<n;i++)
	  if(!prime[i])
	  {
	  	for(int j=i+i;j<n;j+=i)
	  	  prime[j]=true;
	  }
} 

struct Node{
	Node(){}
	Node(int rank,bool flag):rank(rank),flag(flag){}
	int rank;//排名
	bool flag;//是否被查詢 
};

map<int,Node>d;

int main()
{
	maketable(N);//打表
	int n,k,id;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&id);
		d[id]=Node(i,false);
	}
	scanf("%d",&k);
	for(int i=1;i<=k;i++)
	{
		scanf("%d",&id);
		printf("%04d: ",id);//細節 
		if(d.count(id))
		{
			if(d[id].flag)
			{
				printf("Checked\n");//已經被查詢過了 
				continue;
			}
			if(d[id].rank==1)//如果是冠軍
			  printf("Mystery Award\n");
			else if(!prime[d[id].rank])//排名是素數 
			  printf("Minion\n"); 
			else
			  printf("Chocolate\n"); 
			d[id].flag=true;//標記已被查詢過
		}
		else//id不存在 
		  printf("Are you kidding?\n");
	} 
	return 0;
}