-
题目描述:
-
输入一个四行五列的矩阵,找出每列最大的两个数。
-
输入:
-
输入第一行包括一个整数n(1<=n<=1000),接下来的四行每行包括五个整数。代表一个四行五列的矩阵,矩阵元素全部是整数。
-
输出:
-
可能有多组测试数据,对于每组数据,按照样例输出的格式将每列最大的两个数输出,如果最大的两个数中的一个数在这一列中有多个相同的值,则行值取行值小的那一个。
输出时要保留原矩阵的行列顺序,即在原矩阵中行值小的,在输出矩阵中的行值依然小。
-
样例输入:
-
1 1 2 4 9 8 -1 4 9 8 8 12 9 8 7 0 7 8 9 7 0
-
样例输出:
-
12 9 9 9 8 7 8 9 8 8
-
提示:
-
每个数字后面都要输出一个空格
-
-
解题方法:
-
这道题我想到了模拟,对于一列上只有四个数,想办法将他们排成1,2,3,4这样的大小顺序;
-
对于每一列我是这样处理的:对于某一列的数字,固定一个,遍历一列的数字与其比较,如果遍历时比这个数字大,那么这个遍历的数字的等级加一;如果遍历时的数字跟这个数字相等,那么看这个固定的数字的出现是否在遍历的数字的前面,如果是则固定的数字要加一;这样一定会出现0,1,2,3这四个等级。然后在把每列的等级大于2的数字存在数组中输出即可。
-
-
AC代码:
-
#include <cstdio> #include <string.h> #include <cstdlib> int vis[4][5]; int main (){ int t; scanf("%d",&t); while ( t -- ){ for ( int i = 0 ; i < 4 ; i ++ ) for ( int j = 0 ; j < 5 ; j ++ ) { scanf("%d",&vis[i][j]); } int arr[4][5] ; memset(arr,0,sizeof(arr)); for ( int j = 0 ; j < 5 ; j ++ ) for ( int i = 0 ; i < 4 ; i ++ ) { for ( int k = 0 ; k < 4 ; k ++ ) { if ( vis[k][j] > vis[i][j]) arr[k][j]++; if ( vis[k][j] == vis[i][j] && k > i) arr[i][j]++; } } int brr[10]; int m = 0; for ( int j = 0 ; j < 5 ; j ++ ) for ( int i = 0 ; i < 4 ; i ++ ) { if (arr[i][j] >= 2) brr[m++] = vis[i][j]; } for ( int i = 0 ; i < 10 ; i+=2 ) printf("%d ",brr[i]); printf("\n"); for ( int i = 1; i < 10 ; i += 2) printf("%d ",brr[i]); printf("\n"); } return 0; }
-