洛谷P5594 【XR-4】模拟赛 超级详解 (能力全面提升综合题单1.2)

0cde593016bc45a48aafb54aa550a9a1.jpg

 

输入:输入n(选手个数),m(套题个数,做题天数),k(总共可用天数)三个数,然后接下来n行,每行输入m个数。(具体看题目)

输出: k个数据,每个数据都是每天不同套试卷的个数。

代码算法思考:

由输入可知,首先定义并输入变量n,m,k.f312854b764441dbaeebbd12bcaa8e33.png

然后再输入n*m个数据,即为所有选手选择做模拟赛的日子的所有数据,所以要写两个for循环将数据全部存入。f58ebfd264934a9a838ca634afbf8e33.png

之后对for循环内容进行操作,首先要对输入的数据进行一下分析,因为在某天某人做了某套试卷,做的某套试卷是否相同都要考虑。但是实际上讲,到底是某人做的并不重要,重要的是他在哪一天要做的哪套试卷。所以可以定义一个二维数组,利用前行后列分别代表前天数后模拟赛序数。因为n,m都小于1000,所以定义1010的数组大小绝对够用。(注意要定义数组在主函数外,否则因为创建数组过大,占用过多划分给主函数用的内存。)该二维数组给每天的m套试卷都创立了一个位置。

d273c1a797bf46079beb2f276fe934f6.png

然后创建一个变量z,scanf输入每次选手选择做题的天数,取地址输入进z。将z放进二维数组的位置。然后用for循环中创建的变量u放进二维数组的位置,因为一个选手总共做m套试卷,所以第二个for循环中计数变量u对应的是做的第几套试卷。这样就将输入数据放进了应该放的位置。然后对二维数组对应的位置初始化为1.f0afc5db9ca74f40ac16c3e5a3778da3.png

实现的作用:将每个选手选择的做题日子存入进二维数组,例如第x个选手第3天选择了1 2 5三天选择做模拟题,则在num[3][1],num[3][2],num[3][5]初始化为1,表示了在第3天有人做了这三套试卷,且还有一个精妙之处便是,如果另一个y选手也选择了在第三天做了 3 4 5套试卷,则除了新初始化了num[3][3]num[3][4]之外,num[3][5]因为已经初始化过1了,则再次初始化为1时,相当于没有操作。这实现了题目中所述”教练在某天如果有多人做了同一套试卷,教练只用准备一次即可“的要求。fb5f58d1c165442b801674c1a069788f.png

所以在后续处理时,可以不再考虑同一天多人做同一套试卷的情况。

在初始化数组后,需要数据进行最终处理,最终具现为要求的输入结果。具体需要这样操作,因为我们的数组设立是前天数后模拟赛序数,而输出结果也是”天数“个整数,所以我们创建一个for循环,表示循环"天数“次。然后再对当天的数据处理,遍历该行数组的每一列,所以再嵌套一个for循环,如果该列被初始化为1了,说明教练当天需要准备那套试卷,一行中一共有几个1则一共需要准备几套试卷。该部分实现如图:8c06b93c94be40ca8ac7e7c96d48179e.png

用count作为计数器,打印count,表示当天准备的试卷数。循环k次后,就得到全部结果了

 

:这里输出结果允许最后一个数字后也跟着一个空格,但不能保证以后做的每一个题都允许这种情况,所以为了养成良好的习惯,最好对此进行特别处理,在进行循环最后一次时不打印”%d    "(带空格),而是"%d"(不带空格)d83d14b632114914b68dcf995a5e3a6f.png

至此完结,撒花

#include<stdio.h>
int num[1010][1010];
int main()
{
    int n, m, k, z;
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 1; i <=n; i++)
        for (int u = 1; u <= m; u++)
        {
            scanf("%d", &z);
            num[z][u] = 1;
        }
    for (int i = 1; i <= k; i++)
    {
        int count = 0;
        for (int z = 1; z <=m; z++)
            if (num[i][z] == 1)
                count++;
       if(i<k) printf("%d ", count);
       else printf("%d",count);
    }
    return 0;
}

完整代码参上

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值