简单题。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define N 10001
typedef struct participant *Pparticipant;
typedef struct participant{
char id[5];
bool checked;
int rank;
} participant;
void MakeList(bool *primeNumber);
int cmp(const void *v1, const void *v2);
int bianrySearch(Pparticipant students, int left, int right, char id[5]);
int main(int argc, const char * argv[]) {
int n, k, i, j;
bool *primeNumber;
Pparticipant students;
char forCheck[5];
setvbuf(stdout, calloc(1 << 20, sizeof(char)), _IOFBF, 1 << 20);
scanf("%d", &n);
students = (Pparticipant)calloc(n, sizeof(participant));
primeNumber = (bool *)calloc(N, sizeof(bool));
MakeList(primeNumber);
for(i = 0; i < n; i++){
scanf("%s", students[i].id);
students[i].rank = i + 1;
}
qsort(students, n, sizeof(participant), cmp);
scanf("%d", &k);
for(i = 1; i <= k; i++){
scanf("%s", forCheck);
j = bianrySearch(students, 0, n - 1, forCheck);
if(-1 == j){
printf("%s: %s\n", forCheck, "Are you kidding?");
}
else if(students[j].checked){
printf("%s: %s\n", forCheck, "Checked");
}
else{
students[j].checked = true;
if(1 == students[j].rank){
printf("%s: %s\n", forCheck, "Mystery Award");
}
else if(primeNumber[students[j].rank]){
printf("%s: %s\n", forCheck, "Chocolate");
}
else{
printf("%s: %s\n", forCheck, "Minion");
}
}
}
free(primeNumber);
free(students);
return 0;
}
void MakeList(bool *primeNumber){
int i, j;
for(i = 2; i < N; i++){
for(j = 2; j * i < N; j++){
primeNumber[j * i] = true;
}
}
}
int cmp(const void *v1, const void *v2){
return strcmp(((Pparticipant)v1)->id, ((Pparticipant)v2)->id);
}
int bianrySearch(Pparticipant students, int left, int right, char id[5]){
int middle, result;
while(left <= right){
middle = (left + right) >> 1;
result = strcmp(students[middle].id, id);
if(result > 0){
right = middle - 1;
}
else if(result < 0){
left = middle + 1;
}
else{
return middle;
}
}
return -1;
}