原题: https://www.patest.cn/contests/pat-b-practise/1059
思路: 参赛者id是数组下标, 数组值是参赛者排名位置(从1开始),
每次判断0不存在, -1领过奖了, 其它就是位置序号.
实现:
#include <stdio.h>
#define LEN 10010
int isPrime (int n);
// -1 领过奖了 0不存在 其它就是位置序号
int main (void) {
int pnum;
int snum;
int stu[LEN] = {0};
int pno;
int i;
scanf("%d", &pnum);
for (i = 1; i <= pnum; i++) {
scanf("%d", &pno);
stu[pno] = i;
}
scanf("%d", &snum);
for (i = 1; i <= snum; i++) {
scanf("%d", &pno);
if (stu[pno] == 1) {
// 第一名
printf("%04d: Mystery Award
", pno);
stu[pno] = -1;
} else if (stu[pno] == 0) {
// 不存在
printf("%04d: Are you kidding?
", pno);
} else if (stu[pno] == -1) {
// 已领过奖品
printf("%04d: Checked
", pno);
} else if (isPrime(stu[pno]) == 1) {
// 排名是素数
printf("%04d: Minion
", pno);
stu[pno] = -1;
} else {
// 其它情况, 拿到巧克力
printf("%04d: Chocolate
", pno);
stu[pno] = -1;
}
}
return 0;
}
// 0不是素数 1是素数
// 从2开始
int isPrime (int n) {
int i = 2;
while (i * i <= n) {
if (n % i == 0) return 0;
i++;
}
return 1;
}