输入:输入n(选手个数),m(套题个数,做题天数),k(总共可用天数)三个数,然后接下来n行,每行输入m个数。(具体看题目)
输出: k个数据,每个数据都是每天不同套试卷的个数。
代码算法思考:
由输入可知,首先定义并输入变量n,m,k.
然后再输入n*m个数据,即为所有选手选择做模拟赛的日子的所有数据,所以要写两个for循环将数据全部存入。
之后对for循环内容进行操作,首先要对输入的数据进行一下分析,因为在某天某人做了某套试卷,做的某套试卷是否相同都要考虑。但是实际上讲,到底是某人做的并不重要,重要的是他在哪一天要做的哪套试卷。所以可以定义一个二维数组,利用前行后列分别代表前天数后模拟赛序数。因为n,m都小于1000,所以定义1010的数组大小绝对够用。(注意要定义数组在主函数外,否则因为创建数组过大,占用过多划分给主函数用的内存。)该二维数组给每天的m套试卷都创立了一个位置。
然后创建一个变量z,scanf输入每次选手选择做题的天数,取地址输入进z。将z放进二维数组行的位置。然后用for循环中创建的变量u放进二维数组列的位置,因为一个选手总共做m套试卷,所以第二个for循环中计数变量u对应的是做的第几套试卷。这样就将输入数据放进了应该放的位置。然后对二维数组对应的位置初始化为1.
实现的作用:将每个选手选择的做题日子存入进二维数组,例如第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时,相当于没有操作。这实现了题目中所述”教练在某天如果有多人做了同一套试卷,教练只用准备一次即可“的要求。
所以在后续处理时,可以不再考虑同一天多人做同一套试卷的情况。
在初始化数组后,需要数据进行最终处理,最终具现为要求的输入结果。具体需要这样操作,因为我们的数组设立是前天数后模拟赛序数,而输出结果也是”天数“个整数,所以我们创建一个for循环,表示循环"天数“次。然后再对当天的数据处理,遍历该行数组的每一列,所以再嵌套一个for循环,如果该列被初始化为1了,说明教练当天需要准备那套试卷,一行中一共有几个1则一共需要准备几套试卷。该部分实现如图:
用count作为计数器,打印count,表示当天准备的试卷数。循环k次后,就得到全部结果了
注:这里输出结果允许最后一个数字后也跟着一个空格,但不能保证以后做的每一个题都允许这种情况,所以为了养成良好的习惯,最好对此进行特别处理,在进行循环最后一次时不打印”%d "(带空格),而是"%d"(不带空格)
至此完结,撒花
#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;
}
完整代码参上