PTA | 程序设计类实验辅助教学平台 (pintia.cn)
第一种方式:做标记 59_哔哩哔哩_bilibili
#include<iostream>
#include<map>
#include<cmath>
using namespace std;
bool isprime(int x)
{
if(x<2)return 0;
for(int i=2;i*i<=x;i++)
{
if(x%i==0)return false;
}
return true;
}
int a[10005];
int x;
int main() {
int n;cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x,a[x]=i;
}
int k;cin>>k;
for(int i=0;i<k;i++)
{
cin>>x;
if(a[x]==1)printf("%04d: Mystery Award\n",x),a[x]=-1;
else if(isprime(a[x])&&a[x]>0)printf("%04d: Minion\n",x),a[x]=-1;
else if(a[x]==0)printf("%04d: Are you kidding?\n",x);
else if(a[x]>0)printf("%04d: Chocolate\n",x),a[x]=-1;
else if(a[x]==-1)printf("%04d: Checked\n",x);
}
return 0;
}
第二种
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int m[N],check[N];
bool isprime(int a)
{
bool flag=true;
for(int i=2;i<=sqrt(a);++i)
{
if(a%i==0)flag=false;
}
if(flag)return true;
return false;
}
int main()
{
int n=0;cin>>n;
for(int i=1;i<=n;++i)
{
int x;cin>>x;
m[x]=i;
}
int k=0;cin>>k;
for(int i=0;i<k;++i)
{
int num=0;cin>>num;
if(m[num]) //如果可以查得到
{
//刚开始是默认为0的情况,即之前没有出现过 后面出现过之后就打印多吃多占
if(check[num]) printf("%04d: Checked\n", num);
//否则就是之前没有出现过的情况
else if(m[num]==1) //是冠军就打印 神秘大奖
printf("%04d: Mystery Award\n",num);
else if(isprime(m[num])) //如果是素数就输出小黄人
printf("%04d: Minion\n",num);
else printf("%04d: Chocolate\n",num); //不是素数也不是冠军就是 巧克力
check[num]=1; //走过的做一个标记
}
else //查不到就输出玩我呢?
printf("%04d: Are you kidding?\n",num);
}
return 0;
}
第二种思想
利用isprime()函数的返回值:
#include<iostream>
#include<map>
#include<cmath>
using namespace std;
int isprime(int x) {
if (x < 2) return -1;
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) return 2;
}
return 1;
}
int main() {
int n;
cin >> n;
int a[10005];
map<int, int> mp;
for (int i = 0; i < n; i++) {
cin >> a[i];
mp[a[i]] = isprime(i + 1);
}
int k;
cin >> k;
for (int i = 0; i < k; i++) {
int temp;
cin >> temp;
pair<int, int> it = { temp,mp[temp] };
if (it.second == 0) { //
printf("%04d: Are you kidding?\n", it.first);
}
else if (it.second == 4) { //=4就是已经领过奖项了
printf("%04d: Checked\n", it.first);
}
else if (it.second == -1) { //-1就是不是素数的意思
printf("%04d: Mystery Award\n", it.first);
mp[temp] = 4; //标记一下
}
else if (it.second == 1) { //返回1就是素数
printf("%04d: Minion\n", it.first);
mp[temp] = 4; //标记一下
}
else {
printf("%04d: Chocolate\n", it.first);
mp[temp] = 4; //标记一下
}
}
return 0;
}
夭折版
#include<iostream>
#include<map>
#include<cmath>
using namespace std;
struct Sort
{
int index;
int count;
};
bool isprime(int x) {
if (x < 2) return false;
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) return false;
}
return true;
}
int main() {
int n;
cin >> n;
int a[1005];
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int k;
cin >> k;
map<int,Sort> mp;
for (int i = 0; i < k; i++) {
int temp;
cin >> temp;
for(int j=0;j<n;j++)
{
if(a[j]==temp)
{
mp[temp].count++;
mp[temp].index=j;
}
}
}
for (auto& it : mp) {
if (it.second.count == 0) {
printf("%04d: Are you kidding?\n", it.first);
} else if (it.second.count > 1) {
printf("%04d: Checked\n", it.first);
} else if (it.second.index == 0) {
printf("%04d: Mystery Award\n", it.first);
} else if (isprime(it.second.index)) {
printf("%04d: Minion\n", it.first);
} else {
printf("%04d: Chocolate\n", it.first);
}
}
return 0;
}