口罩发放(C语言实现)

时间:2021-07-30 01:29:54

为了抗击来势汹汹的 COVID19 新型冠状病毒,全国各地均启动了各项措施控制疫情发展,其中一个重要的环节是口罩的发放。

某市出于给市民发放口罩的需要,推出了一款小程序让市民填写信息,方便工作的开展。小程序收集了各种信息,包括市民的姓名、身份证、身体情况、提交时间等,但因为数据量太大,需要根据一定规则进行筛选和处理,请你编写程序,按照给定规则输出口罩的寄送名单。
可以AC的解答请参考天梯赛练习集 L2-034 口罩发放(25分)史前巨细,坑点满满
按照如下做法,只得到了19分,有测试点未通过。还没有想出来怎么解决这个问题。
口罩发放(C语言实现)

#include <stdio.h>
#include <string.h>

typedef struct Person{
    char name[11];
    char id[21];
    int status;
    char time[6];
    int cnt;
}Person;

int main(){
    int d, p, i, j, k, t, s, len_id, itmp;
    Person person[1000], total[30000], tmp;
    int scnt = 0, tcnt = 0, flag = 0;
    
    scanf("%d%d", &d, &p); //输入数据
    for (i=0; i<30000; i++){
        total[i].cnt = 0;
    }
    for (i=0; i<d; i++){
        scanf("%d%d", &t, &s);
        scnt = 0;
//         for (j=0; j<t; j++){
//             person[j].cnt = 0;
//         }
        for (j=0; j<t; j++){ //输入申请人的信息
            scanf("%s %s %d %s", person[j].name, person[j].id, &person[j].status, person[j].time);
//            scanf("%d %s", &person[j].status, person[j].time);
            flag = 0;
            len_id = strlen(person[j].id);
            person[j].cnt = 0;
            if (len_id != 18){
                continue;
            }
            for (k=0; k<tcnt; k++){
                /*printf("k = %d\n", k);*/
                if (strcmp(person[j].id, total[k].id) == 0){
                    flag = 1;
                    person[j].cnt = total[k].cnt; 
                    /*printf("welcome boys and girls, cnt = %d\n", person[j].cnt);*/
                    if (person[j].status == 1){
                        total[k].status = person[j].status;
                    }
                    break;
                }
            }
            /*printf("flag = %d\n", flag);*/
            if (flag==0 && len_id==18){
                total[tcnt] = person[j];
                tcnt++;
            }
            /*if (flag == 1){
                printf("This has existed.\n");
            }*/
        }
        for (j=0; j<t-1; j++){ //按照提交时间先后顺序排序
            for (k=j+1; k<t; k++){
                if (strcmp(person[j].time, person[k].time) > 0){
                    tmp = person[j];
                    person[j] = person[k];
                    person[k] = tmp;
                }
            }
        }
        
        for (j=0; j<t; j++){
            len_id = strlen(person[j].id);
            if (len_id<18 || len_id>18){
                continue;
            }
            /*printf("hey cnt = %d\n", person[j].cnt);*/
            for (k=0; k<tcnt; k++){
                if (strcmp(person[j].id, total[k].id) == 0){
                    if (total[k].cnt > 0){
                        total[k].cnt++;
                        if (total[k].cnt == p+1){
                            total[k].cnt = 0;
                        }
                        person[j].cnt = total[k].cnt;
                    }
                }
            }
            if (person[j].cnt==0){
                scnt++;
                person[j].cnt++;
                if (scnt <= s){
                    printf("%s %s\n", person[j].name, person[j].id);
                    for (k=0; k<tcnt; k++){
                        if (strcmp(person[j].id, total[k].id) == 0){
                            total[k].cnt = person[j].cnt;
                        }
                    }
                }
            }
        }
        
//         printf("打印\n");
//         for (j=0; j<t; j++){
//             printf("%s %s", person[j].name, person[j].id);
//             printf(" %d %s\n", person[j].status, person[j].time);
//         }
    }
    
    /*printf("tcnt = %d\n", tcnt);*/
    for (i=0; i<tcnt; i++){
        if (total[i].status == 1){
            printf("%s %s\n", total[i].name, total[i].id);
        }
    }
    /*printf("tcnt = %d\n", tcnt);
    for (i=0; i<tcnt; i++){
        printf("%s %s", total[i].name, total[i].id);
        printf(" %d %s\n", total[i].status, total[i].time);
    }*/
    
    return 0;
}