PAT 乙级 1059 C语言竞赛 (20 分)

题目:https://pintia.cn/problem-sets/994805260223102976/problems/994805269828059136

经验总结:
使用数组下边来标记ID,数组的值即是排名。如果某ID领过奖品(即输出过),那么把其排名设为负数,下次再次查询排名是负数的ID时,输出Checked即可。注意,只在排名是正数且第一次查询时设为负数,所以要判断排名值是否还是正数。
记:c++不具备数组越界检查功能,所以要注意数组的大小。
记:如果能用数组的话,尽量用数组,用map之类的话耗时可能会变长。
记:判断一个数是否是素数的代码应该记一下:

bool isPrime(int n){ //判断一个数是否是素数
	if(n<=1) return false;
	if(n==2 || n==3) return true;
	if(n%6!=1 && n%6!=5) return false;
	for(int i=5;i*i<=n;i+=6)
	{
	    if(n%i==0 || n%(i+2)==0) return false;
	}
    return true;
}

C++代码:

#include
using namespace std;
int stu[10005];
bool isPrime(int n){
	if(n<=1) return false;
	if(n==2 || n==3) return true;
	if(n%6!=1 && n%6!=5) return false;
	for(int i=5;i*i<=n;i+=6)
	{
	    if(n%i==0 || n%(i+2)==0) return false;
	}
    return true;
}
int main() {
	int n,k;
	scanf("%d",&n);
	for(int i = 1;i<=n;i++){
		int id;
		scanf("%d",&id);
		stu[id]=i;
	}
	scanf("%d",&k);
	while(k--){
		int id;
		scanf("%d",&id);
		printf("%04d: ",id); //位数不足,需要以0补齐
		int rank = stu[id];
		if(rank == 0){
			printf("Are you kidding?\n");
		}else if(rank<0){
			printf("Checked\n");
		}else if(rank == 1){
			printf("Mystery Award\n");
		}else if(isPrime(rank)){
			printf("Minion\n");
		}else {
			printf("Chocolate\n");
		}
		if(stu[id]>0){ //判断是否是第一次查询
			stu[id] *= -1;
		}
	}
	return 0;
}

你可能感兴趣的:(PAT,乙级)