“战疫杯”大学生程序设计在线邀请赛——辛苦的楼长

疫情防控期间,要尽最大努力的保障同学们饮食!楼长们正在统计订饭的人数,一共是三个园区的统计表放在了一个文档里,有一些粗心的同学没有分清园区,错误的将自己的信息填到了其他园区的统计表上。身为帮助楼长的热心同学,你需要写一个程序将所有同学分到正确的园区并统计各个园区需要准备的早饭、午饭、晚饭的份数。

输入格式:

三组数据,每一组代表错误的园区的统计表。

每一组数据第一行是这个统计表上的信息数目n。
该组数据第2行到第n+1行是具体的信息,分别是:宿舍楼(格式为“园区(拼音,松:song,菊:jv,柳:liu)+楼号(数字)”中间无空格,例如“jv4”就表示菊园四号楼),宿舍号,早饭订饭数量,午饭订饭数量,晚饭订饭数量(某个寝室的信息只提交一次,不会重复)。

输出格式:

三组数据,分别代表三个园区的数据状况,按照“松-菊-柳”的顺序输出。

每组数据第一行有四个数,分别是该园区实际订餐的寝室数目,该园区总共订的早餐数目,午餐数目,晚餐数目。

然后输出该园区的所有正确的订单信息,排序输出(保证楼号非递减输出,若是楼号相同的订单则按找寝室号递增输出)。

输入样例:

在这里给出一组输入。例如:

4
song6 321 1 2 1
jv4 422 6 6 6
liu2 211 4 5 3
jv1 331 1 5 4
1
song2 333 6 6 6
1
jv6 612 2 3 3

输出样例:

2 7 8 7
song2 333 6 6 6
song6 321 1 2 1
3 9 14 13
jv1 331 1 5 4
jv4 422 6 6 6
jv6 612 2 3 3
1 4 5 3
liu2 211 4 5 3

数据范围

楼号保证在范围[0-9],房号范围为(100~999),订餐数目总数小于1000,每个园区订餐信息不超过20条。

代码长度限制

16 KB

时间限制

1000 ms

内存限制

64 MB

C语言代码如下:

#include<stdio.h>
#include<stdlib.h>
//定义结构体变量
typedef struct data{
    char name[10];
    int mark;
    int building;
    int room;
    int breakfast;
    int lunch;
    int dinner;
}Floor;
/**********************************************************
与下面的 qsort 对每一个结构体排序:松、菊、柳分别对应 mark=1、2、3
然后分别以 mark、building、room、进行排序(均为升序)。
***********************************************************/
int cmp(const void *p1 , const void *p2){
    Floor *fa = (Floor *)p1;
    Floor *fb = (Floor *)p2;
    if(fa->mark == fb->mark){
        if(fa->building == fb->building){
            return (fa->room - fb->room);
        }
        return (fa->building - fb->building);
    }
    return (fa->mark - fb->mark);
}

int main(){
    Floor f[60];
    int sum = 0 , n = 3;
    //每个园区的早、午、晚餐总数
    int sbreakfast1 = 0 , slunch1 = 0 , sdinner1 = 0 , s = 0;
    int sbreakfast2 = 0 , slunch2 = 0 , sdinner2 = 0 , j = 0;
    int sbreakfast3 = 0 , slunch3 = 0 , sdinner3 = 0 , l = 0;
    while(n--){
        int t;
        scanf("%d\n",&t);
        //对每组数据进行相应处理
        for(int i = sum ; i<sum+t ; i++){
            scanf("%s %d %d %d %d\n",f[i].name,&f[i].room,&f[i].breakfast,&f[i].lunch,&f[i].dinner);
            if(f[i].name[0]=='s'){
                s++;
                f[i].mark = 1;
                f[i].building = f[i].name[4]-'0';
                sbreakfast1 += f[i].breakfast;
                slunch1 += f[i].lunch;
                sdinner1 += f[i].dinner;
            }else if(f[i].name[0]=='j'){
                j++;
                f[i].mark = 2;
                f[i].building = f[i].name[2]-'0';
                sbreakfast2 += f[i].breakfast;
                slunch2 += f[i].lunch;
                sdinner2 += f[i].dinner;
            }else{
                l++;
                f[i].mark = 3;
                f[i].building = f[i].name[3]-'0';
                sbreakfast3 += f[i].breakfast;
                slunch3 += f[i].lunch;
                sdinner3 += f[i].dinner;
            }
        }
        sum += t;
    }

    qsort(f , sum , sizeof(f[0]) , cmp);
    //输出
    printf("%d %d %d %d\n",s,sbreakfast1,slunch1,sdinner1);
    for(int i=0 ; i<s ; i++){
        printf("%s %d %d %d %d\n",f[i].name,f[i].room,f[i].breakfast,f[i].lunch,f[i].dinner);
    }
    printf("%d %d %d %d\n",j,sbreakfast2,slunch2,sdinner2);
    for(int i=s ; i<s+j ; i++){
        printf("%s %d %d %d %d\n",f[i].name,f[i].room,f[i].breakfast,f[i].lunch,f[i].dinner);
    }
    printf("%d %d %d %d\n",l,sbreakfast3,slunch3,sdinner3);
    for(int i=s+j ; i<s+j+l ; i++){
        printf("%s %d %d %d %d\n",f[i].name,f[i].room,f[i].breakfast,f[i].lunch,f[i].dinner);
    }
}

如有错误,还请指教。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值