九度OJ 1200:最大的两个数 (最值)
- 题目描述:
-
输入一个四行五列的矩阵,找出每列最大的两个数。
- 输入:
-
输入第一行包括一个整数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
- 提示:
-
每个数字后面都要输出一个空格
思路:
最值问题,算法O(N)。
代码:
#include <stdio.h> #include <string.h> #define M 4 #define N 5 int main(void) { int i, j, k, n, tmp; int a[M][N], f[M][N]; while (scanf("%d", &n) != EOF) { while ((n--)>0) { for (i=0; i<M; i++) { for (j=0; j<N; j++) { scanf("%d", &a[i][j]); f[i][j] = i; } } for (j=0; j<N; j++) { for (i=0; i<M-1; i++) { for (k=0; k<M-1-i; k++) { if (a[k][j] < a[k+1][j]) { tmp = a[k][j]; a[k][j] = a[k+1][j]; a[k+1][j] = tmp; tmp = f[k][j]; f[k][j] = f[k+1][j]; f[k+1][j] = tmp; } } } } for (i=0; i<2; i++) { for (j=0; j<N; j++) { if (f[0][j] < f[1][j]) printf("%d ", a[i][j]); else printf("%d ", a[1-i][j]); } printf("\n"); } } } return 0; } /************************************************************** Problem: 1200 User: liangrx06 Language: C Result: Accepted Time:10 ms Memory:912 kb ****************************************************************/
编程算法爱好者。