1116. Come on! Let's C (20)解题报告

简单题。

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值