题目:
Description
某项目可以分为n个不同的子项目,每个子项目都是独立的。现在有m个公司来投标这些子项目,每个公司对这n个子项目都给出了报价。一个公司可以承担若干个项目,一个项目不能由2个或2个以上的公司共同完成。请你给出完成整个项目的最高和最低报价。
Input
输入的第一个整数T表示有多少组测试数据(1≤T≤10)。每组测试数据的第一行是整数n(1≤n≤1000),表示有项目可以分n个子项目;第二行是整数m(1≤m≤1000),表示有m个公司来投标。然后是m行n列的正整数,第i行第j列的正整数k(1≤k≤100),表示第i家公司对第j个子项目的报价。
Output
为每组测试数据输出两行,第一行是整个项目的最高报价,第二行是整个项目的最低报价.
Sample Input
1 4 5 90 90 90 85 90 85 90 90 90 90 85 90 90 90 90 90 90 85 90 85
Sample Output
360 345
#include <stdio.h>
int a[1111][1111]={0};
int main()
{
int t;
scanf("%d",&t);
for(int k=0;k<t;k++)
{
intn,m;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
int max=0,min=0;
for(int i=0;i<n;i++)
{
int _max=a[0][i];
int _min=a[0][i];
for(int j=1;j<m;j++)
{
_max=_max>a[j][i]?_max:a[j][i];
_min=_min<a[j][i]?_min:a[j][i];
}
max+=_max;
min+=_min;
}
printf("%d\n%d\n",max,min);
}
return 0;
}
解题思路:
将数据读入二维矩阵后,用循环将每列(即每个项目)的最大值_max、最小值_min找出,然后加到max、min上,然后输出max、min。
优化解法【转】:
#include <stdio.h>
int main()
{
int a[1002],b[1002];
int str,i,j,m,n,T,max,min;
scanf("%d",&T);
while(T--)
{
max=0;min=0;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
for(j=1;j<m;j++)
{
for(i=1;i<=n;i++)
{
scanf("%d",&str);
if(str>=a[i]) a[i]=str;
if(str<=b[i]) b[i]=str;
}
}
for(i=1;i<=n;i++)
{
max+=a[i];
min+=b[i];
}
printf("%d\n%d\n",max,min);
}
return 0;
}
优化点:
分别用a、b两一维数组保存各个项目的最大、最小报价,最后用循环将整个的最大、最小报价算出即可。
减小了程序的空间复杂度。