题目描述
知识点
素数
实现
码前思考
- 就是很简单的素数的判断,思维量不大
代码实现
#include "bits/stdc++.h"
using namespace std;
//最大的排名
const int maxn = 1e4+10;
//是否是质数
bool isPrime[maxn];
map<int,int> n2r;
set<int> isChecked;
int n;
int k;
void computePrime(){
//素数的计算要从2开始,1不是素数!
for(int i=2;i<=maxn;i++){
if(isPrime[i] == true){
//如果是质数,那么需要进行更新
for(int j=i+i;j<=maxn;j+=i){
isPrime[j] = false;
}
}
}
return;
}
int main(){
fill(isPrime,isPrime+maxn,true);
scanf("%d",&n);
for(int i=1;i<=n;i++){
int id;
scanf("%d",&id);
n2r[id] = i;
}
//下面进行素数打表
computePrime();
//然后进行读入
scanf("%d",&k);
for(int i=0;i<k;i++){
int id;
scanf("%d",&id);
printf("%04d: ",id);
//如果id有效
if(n2r.count(id) != 0){
if(isChecked.find(id) == isChecked.end()){//没有询问过
if(n2r[id] == 1){
printf("Mystery Award\n");
}else if(isPrime[n2r[id]] == true){
printf("Minion\n");
}else{
printf("Chocolate\n");
}
isChecked.insert(id);
}else{
printf("Checked\n");
}
}else{
printf("Are you kidding?\n");
}
}
return 0;
}
码后反思
- 这里用到了
map
和set
,map
我已经会用了,但是set
我用的还不熟,需要单独写一篇博客整理一下!
二刷代码
- 最好在素数筛里面写上p[0]=1,p[1]=1,不然很有可能出错;
- 访问之后记得设置为visited;
- 素数筛里面要写成j<maxn,不能写成<=
- 记得调用findPrime函数,不然白写了。。。
//采用哈希解题
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5+10;
int rklist[maxn];
bool vis[maxn]={0};
bool in[maxn]={0};
bool p[maxn]={0};//素数表
int n;
int k;
void findPrime(){
p[0]=1;p[1]=1;
for(int i=2;i<maxn;i++){
if(!p[i]){
for(int j=i+i;j<maxn;j+=i){
p[j]=1;
}
}
}
return;
}
int main(){
findPrime();
scanf("%d",&n);
for(int i=0;i<n;i++){
int cur;
scanf("%d",&cur);
rklist[cur]=i+1;
in[cur]=true;
}
scanf("%d",&k);
for(int i=0;i<k;i++){
int cur;
scanf("%d",&cur);
printf("%04d: ",cur);
if(in[cur]==false){
printf("Are you kidding?\n");
continue;
}
if(vis[cur]==true){
printf("Checked\n");
}else{
if(rklist[cur]==1){
printf("Mystery Award\n");
vis[cur]=true;
}else{
vis[cur]=true;
if(!p[rklist[cur]]){
printf("Minion\n");
}else{
printf("Chocolate\n");
}
}
}
}
return 0;
}