题目描述:
C语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛。既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽:
0. 冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……)。
1. 排名为素数的学生将赢得最好的奖品 —— 小黄人玩偶!
2. 其他人将得到巧克力。
给定比赛的最终排名以及一系列参赛者的ID,你要给出这些参赛者应该获得的奖品。
输入格式:
输入第一行给出一个正整数N(<=10000),是参赛者人数。随后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?
分析:
笔者设立了一个结构体,在录入id时,将奖品等信息进行录入,并按照id作为数组下标存储每一位考生的结构体。
代码如下:
#include<iostream>
#include<string>
#include<math.h>
#include<iomanip>
using namespace std;
const int maxn=10000;
struct competitor{ //设置参赛者结构体,成员:ID,奖品,查询标记
int ID;
string prize;
bool flag;
competitor(){
flag=false;ID=-1; //成员初始化
}
}stu[maxn];
bool is_prime(int n){ //判断素数的函数。
int temp=(int)sqrt(1.0*n); //1.0*n是为了将n转换成double类型,这是平方根sqrt函数的要求
for(int i=2;i<=temp;i++){
if(n%i==0){
return false; //如果2~根号n之间找到一个因数,就不是素数,返回false。
}
}
return true; //是素数
}
int main()
{
int n,k,chaxun[maxn],id;
cin>>n; //读入考生人数
for(int i=1;i<=n;i++){
cin>>id; //读入考生ID
stu[id].ID =id; //将考生ID写入到自己的成员中,以ID作为下标,方便查询
if(i==1){ //按照录入顺序就是排名,
stu[id].prize ="Mystery Award"; //第一名的奖品写入到结构体成员prize中
}
else if(is_prime(i)){
stu[id].prize ="Minion"; //每次为素数的,写入相应奖品
}
else stu[id].prize ="Chocolate"; //其余人的奖品写入
}
cin>>k; //读入待查询人数
for(int i=1;i<=k;i++){
cin>>chaxun[i]; //读入所有的待查询ID
}
for(int i=1;i<=k;i++){
if(stu[chaxun[i]].ID ==chaxun[i]){ //如果排名中有这个人的ID
if(stu[chaxun[i]].flag ==false){ //并且奖品还没有被领过
cout<<setfill('0')<<setw(4)<<chaxun[i]<<": "<<stu[chaxun[i]].prize<<endl;//按照格式输出,记得ID是四位数字
stu[chaxun[i]].flag =true; //将标记该位true,说明该考生已经领过奖品
}
else {
cout<<setfill('0')<<setw(4)<<chaxun[i]<<": "<<"Checked"<<endl; //领过奖品了,按照格式输出
}
}
else {
cout<<setfill('0')<<setw(4)<<chaxun[i]<<": "<<"Are you kidding?"<<endl; //找不到要查询的id
}
}
}