C 语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛。既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽:
- 0、冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……)。
- 1、排名为素数的学生将赢得最好的奖品 —— 小黄人玩偶!
- 2、其他人将得到巧克力。
给定比赛的最终排名以及一系列参赛者的 ID,你要给出这些参赛者应该获得的奖品。
输入格式:
输入第一行给出一个正整数 N(≤104),是参赛者人数。随后 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?
题目比较简单,由于第一次使用 迭代器的find()方法 特别记录一下
有不使用迭代器的 循环比较 和 使用迭代器 的两种AC版本
使用了迭代器的版本
#include <iostream> #include <vector> #include <string> #include <math.h> #include <iomanip> #include <algorithm> using namespace std; //素数判断 bool isPrimeNum(int n){ bool flag=true; int m=sqrt(n); for(int i=2;i<=m;i++){ if(n%i==0){ flag=false; } } return flag; } int main(){ int n,temp,m; cin >> n; vector<int> rank; vector<int> checkList; vector<int> checkedList; int condition{0}; vector<string> str{": Checked",": Are you kidding?",": Mystery Award",": Minion",": Chocolate"}; for(int i=0;i<n;i++){ cin>>temp; rank.push_back(temp); } cin >> m; for(int i=0;i<m;i++){ cin >> temp; checkList.push_back(temp); } for(int i=0;i<m;i++){ vector<int>:: iterator it1,it2; //迭代器,find(begin(),end(),要查找的元素) 需要引入<algorithm> 头文件 //直接查找元素是否存在vector容器中,返回值是对应元素的迭代器,失败时返回结尾迭代器 it1=find(checkedList.begin(),checkedList.end(),checkList[i]);//是否查过 it2=find(rank.begin(), rank.end(), checkList[i]);//在不在排行榜中 if(it1!=checkedList.end()){ condition=0; }else if(it2!=rank.end()){ checkedList.push_back(checkList[i]); for(int j=0;j<n;j++){ if(rank[j]==checkList[i]) { //判断排名 冠军是神秘大奖,素数是小黄人,其他是巧克力 if(j==0){//冠军 神秘大奖 condition=2; }else if(isPrimeNum(j+1)){//素数 小黄人 condition=3; }else{//其他获奖者 巧克力 condition=4; } } } }else{ //不在排名中 condition=1; } cout <<setw(4)<<setfill('0')<< checkList[i] << str[condition]<<endl; //setw()声明输出符号的宽度,默认不足补空格,setfill('0')空缺处补0符号,setiosflags(ios::left)设置对其模式,默认右对齐 //需要引入<iomanip>头文件 } return 0; }
使用循环比较的版本
#include <iostream> #include <vector> #include <string> #include <math.h> #include <iomanip>using namespace std; //素数判断 bool isPrimeNum(int n){ bool flag=true; int m=sqrt(n); for(int i=2;i<=m;i++){ if(n%i==0){ flag=false; } } return flag; } int main(){ int n,temp,m; cin >> n; vector<int> rank; vector<int> checkList; vector<int> checkedList; int condition{0}; vector<string> str{": Checked",": Are you kidding?",": Mystery Award",": Minion",": Chocolate"}; for(int i=0;i<n;i++){ cin>>temp; rank.push_back(temp); } cin >> m; for(int i=0;i<m;i++){ cin >> temp; checkList.push_back(temp); } for(int i=0;i<m;i++){ bool isFind=false; bool isChecked=false; for(int j=0;j<rank.size();j++){ if(checkList[i]==rank[j]){ isFind=true; } } for(int j=0;j<checkedList.size();j++){ if(checkList[i]==checkedList[j]){ isChecked=true; } } if(isChecked){//已经查过了 condition=0; }else if(isFind){//没查过,且在排名中 checkedList.push_back(checkList[i]); for(int j=0;j<n;j++){ if(rank[j]==checkList[i]) { //判断排名 冠军是神秘大奖,素数是小黄人,其他是巧克力 if(j==0){//冠军 神秘大奖 condition=2; }else if(isPrimeNum(j+1)){//素数 小黄人 condition=3; }else{//其他获奖者 巧克力 condition=4; } } } }else{ //不在排名中 condition=1; } cout <<setw(4)<<setfill('0')<< checkList[i] << str[condition]<<endl; //setw()声明输出符号的宽度,默认不足补空格,setfill('0')空缺处补0符号,setiosflags(ios::left)设置对其模式,默认右对齐 //需要引入<iomanip>头文件 } return 0; }