口罩发放(C语言实现)

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

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

#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;
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 引用中提到,“接下来D块数据,每块给出一天的申请信息。第i块数据的第一行是两个整数Ti和Si(1≤Ti,Si≤1000),表示在第i天有Ti条申请,总共有Si个口罩发放名额。随后Ti行,每行给出一条申请信息,格式如下: 姓名 身份证号 身体情况 提交时间”。而引用中说明了某市为了方便工作开展推出一款小程序,该小程序收集了市民的姓名、身份证、身体情况、提交时间等信息,并根据一定规则进行筛选和处理,输出口罩的寄送名单。根据引用的要求,口罩发放的记录要求身份证号必须是18位的数字,同一个身份证号在第i天申请成功后,接下来的P天不能再次申请。在符合身份证号和申请间隔的情况下,按照提交时间的先后顺序发放,直至全部记录处理完毕或Si个名额用完。如果提交时间相同,则按照在列表中出现的先后顺序决定。根据这些规则,可以编写程序处理测试点L2-034并输出口罩发放名单。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [天梯赛练习集 L2-034 口罩发放(25分)史前巨细,坑点满满](https://blog.csdn.net/m0_73876538/article/details/127675802)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值