最大的两个数
来源:华中科技大学
题目描述
输入一个四行五列的矩阵,找出每列最大的两个数。
输入描述:
接下来的四行每行包括五个整数。代表一个四行五列的矩阵,矩阵元素全部是整数。
输出描述:
可能有多组测试数据,对于每组数据,按照样例输出的格式将每列最大的两个数输出,如果最大的两个数中的一个数在这一列中有多个相同的值,则行值取行值小的那一个。
输出时要保留原矩阵的行列顺序,即在原矩阵中行值小的,在输出矩阵中的行值依然小。
输入
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
这题还真的有点儿意思!
#include<bits/stdc++.h>
#define MIN 0x80000000
using namespace std;
int main(void)
{
int a[4][5];
bool flags[4][5];
int ans[2][5];
while(cin>>a[0][0]){
for(int i=0;i<4;i++){
for(int j=0;j<5;j++){
if(i||j) cin>>a[i][j];
}
}
for(int i=0;i<4;i++){
for(int j=0;j<5;j++){
flags[i][j]=false;
}
}
for(int j=0;j<5;j++){
for(int k=0;k<2;k++){
int max=MIN;
int index;
for(int i=0;i<4;i++){
if(flags[i][j]==false){
index=i;
break;
}
}//注意点:这一列中第一个元素的选择
for(int i=0;i<4;i++){
if(a[i][j]>a[index][j]&&!flags[i][j]) index=i;
}
flags[index][j]=true;
}
}
for(int j=0;j<5;j++){
int count=0;
for(int i=0;i<4;i++){
if(flags[i][j]){
ans[count][j]=a[i][j];
count++;
}
}
}
for(int i=0;i<2;i++){
for(int j=0;j<5;j++){
cout<<ans[i][j]<<" ";
}
cout<<endl;
}
}
return 0;
}
#include <stdio.h>
int arr[4][5];
int main() {
int num;
while (~scanf("%d", &num)) {
arr[0][0] = num;
int cnt = 1;
while (cnt < 20) {
scanf("%d", &arr[cnt / 5][cnt % 5]);
cnt++;
}
// 找出两个数,难的地方在于需要保持两个数的出现顺序不能动
for (int i = 0; i < 5; ++i) {
for (int j = 2; j < 4; ++j) {
if (arr[j][i] > arr[1][i]) {
if (arr[1][i] > arr[0][i]) {
arr[0][i] = arr[1][i];
}
arr[1][i] = arr[j][i];
} else if (arr[j][i] > arr[0][i]) {
if (arr[1][i] > arr[0][i]) {
arr[0][i] = arr[1][i];
}
arr[1][i] = arr[j][i];
}
}
}
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 5; ++j) {
printf("%d%c", arr[i][j], j == 4 ? '\n' : ' ');
}
}
}
return 0;
}