C语言之软件工程

题目描述

Merlin 的软件工程老师 Max 布置了开发一个软件的大作业。由于这是一个大型软件,所以单靠 Merlin 一个人不可能在预定时间内做完,必须与其他人合作。

由于大家都要做这个作业,所以 Merlin 理所当然找他的同班同学,但是同班同学的能力是参差不齐的。全班都很明确,这个工程可以分为 n 个不同的部分,每个部分都是独立,并且每个人都有一定的能力完成其中一个部分。Merlin 认为,自己应该去做项目经理的职位,把 n个部分分配给若干个人,不同的部分可以分配给一个人或者多个人,但是一个部分只能分配给一个人。

Merlin 的人缘很好,同学们都愿意与他合作。但是,每个人每个部分能够得到的分数是不同的,Merlin 希望给每个人每个部分能够得到的分数一个估算(百分制),而能够得到的分数就是项目的个人部分的总和,最后求出平均值。即 最后分数=每个部分分数/n。

面对众多的分数,Merlin 已经害怕了,而且 Merlin 很懒,自己不想去做其中任何的一个部分,请你编写一个程序,帮助 Merlin 求出可以得到的最高分。 输入

第 1 行是一个正整数 n<=1000,表示项目可以划分为 n 部分。第 2行是一个正整数 m<=1000,表示全班一共有 m个同学(不包括 Merlin)。然后是 m 行 n 列的正整数,第 i行 j 列正整数 k (k<100),表示同学 i 可以在项目中的第 j 部分获得分数 k。

输出

只有一个实数。Merlin 能够得到的最大分数,结果保留两位小数。

输入: 5 5

90 90 90 85 90

90 85 90 90 85

90 90 85 90 90

90 90 90 90 85

85 90 85 90 90

输出:90.00

#include<stdio.h>
int main()
{
	int m,n;
	scanf("%d%d",&m,&n);
	int i,j;
	double total=0;
	int max[1000]={0};
	for(i=0;i<m;i++){
		for(j=0;j<n;j++){
			int k;
			scanf("%d",&k);
			if(k>max[j]){
				max[j]=k;
			}
		}
	}
	for(i=0;i<n;i++){
		total=total+max[i];
	}
	printf("%.2f",total/n);
	return 0;
}

题意理解:一个人可以接手多个项目,但每个项目只能由一个人接手。所以,应该比较每一列哪个数最大,就算每一列的最大数都在同一行,即所有的项目被同一个人接手,这也是符合题意得。反之,如果找每一行的最大值,则无法确保一个项目只被一个人接手,则还要比较每一列的最大值,这样是不对的。

问题一:怎样找出每一列的最大值?

上述代码的解决方法是用一个数组存储每一列的最大得分。

1.当以行输入的时候,

初始状态:

· n = 5(5个部分)
· m = 5(5个同学)
· max_score = [0, 0, 0, 0, 0]

第1个同学的数据:90 90 90 85 90

· 部分1: 90 > 0 → max_score[0] = 90
· 部分2: 90 > 0 → max_score[1] = 90
· 部分3: 90 > 0 → max_score[2] = 90
· 部分4: 85 > 0 → max_score[3] = 85
· 部分5: 90 > 0 → max_score[4] = 90
· 当前 max_score = [90, 90, 90, 85, 90]

第2个同学的数据:90 85 90 90 85

· 部分1: 90 = 90 → 不变
· 部分2: 85 < 90 → 不变
· 部分3: 90 = 90 → 不变
· 部分4: 90 > 85 → max_score[3] = 90
· 部分5: 85 < 90 → 不变
· 当前 max_score = [90, 90, 90, 90, 90]

第3个同学的数据:90 90 85 90 90

· 部分1: 90 = 90 → 不变
· 部分2: 90 = 90 → 不变
· 部分3: 85 < 90 → 不变
· 部分4: 90 = 90 → 不变
· 部分5: 90 = 90 → 不变
· 当前 max_score = [90, 90, 90, 90, 90]

第4个同学的数据:90 90 90 90 85

· 所有部分得分 ≤ 当前最大值 → 不变
· 当前 max_score = [90, 90, 90, 90, 90]

第5个同学的数据:85 90 85 90 90

· 所有部分得分 ≤ 当前最大值 → 不变
· 最终 max_score = [90, 90, 90, 90, 90]

就是不断用每一列最大的数替换,反正都是列的最大数,而且都是找出每一列的最大数,只要是最大数就行。

综上,以后要记住这种用数组储存最大值的方法,不需要考虑任何条件,只需要求出每一列的最大值。

2.当以列输入的时候,

#include<stdio.h>
int main()
{
	int m,n;
	scanf("%d%d",&m,&n);
	int i,j;
	int a[m][n];
	int max=0;
	double total=0;
	for(j=0;j<n;j++){
		for(i=0;i<m;i++){
			scanf("%d",&a[i][j]);
			if(max<a[i][j]){
				max=a[i][j];
			}
		}
		total=total+max;
	}
	printf("%.2f",total/n);
	return 0;
}

自以为可以按列输入,但实际输入是按行输入,所以把第一行的数当成第一列的数字了,这样的输入是不对的,所以只能按照行输入,按照上述取存放每一列最大值的代码。所以上述代码不对。

posted @ 2025-12-04 17:59  代码无bug抓狂者  阅读(10)  评论(0)    收藏  举报