每个用例包含四行,每行包括五个整数。代表一个四行五列的矩阵,矩阵元素全部是整数。
可能有多组测试数据,对于每组数据,按照样例输出的格式将每列最大的两个数输出,如果最大的两个数中的一个数在这一列中有多个相同的值,则行值取行值小的那一个。 输出时要保留原矩阵的行列顺序,即在原矩阵中行值小的,在输出矩阵中的行值依然小。
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
27 44 76 14 44 91 49 37 16 90 35 58 44 67 84 15 22 90 27 39
91 49 76 67 90 35 58 90 27 84
#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;
}
#include <stdio.h>
int main() {
int buf[4][5];
while (scanf("%d%d%d%d%d",&buf[0][0],&buf[0][1],&buf[0][2],&buf[0][3],&buf[0][4])!=EOF) {
for (int i=1; i<4; i++) {
scanf("%d%d%d%d%d",&buf[i][0],&buf[i][1],&buf[i][2],&buf[i][3],&buf[i][4]);
}
int ans[2][5];
for (int i=0; i<2; i++)
for (int j=0; j<5; j++)
ans[i][j]=0;
for (int i=0; i<=3; i++) {
for (int j=0; j<5; j++) {
if (buf[i][j]>ans[0][j] || buf[i][j]>ans[1][j]) {
if (ans[0][j]>ans[1][j])
ans[1][j]=buf[i][j];
else {
ans[0][j]=ans[1][j];
ans[1][j]=buf[i][j];
}
}
}
}
for (int i=0; i<2; i++) {
for (int j=0; j<5; j++) {
if (j!=4)
printf("%d ",ans[i][j]);
else
printf("%d\n",ans[i][j]);
}
}
}
return 0;
}
#include<iostream> #include <algorithm> using namespace std; int main(){ int a[4][5]={0}; for(int j=0;j<4;j++){ for(int l=0;l<5;l++){ int b=0; cin>>b; a[j][l]=b; } } for(int i=0;i<5;i++){ //最外层循环,取每一列 int f=3; //标志位,第一个最小值放到最后,第二个最小值放到倒数第二位 for(int j=0;j<2;j++){ //查找两次,每次查找最小值,放到最后 int m=a[0][i],s=0; //最小值标记,及其位置 for(int l=0;l<4-j;l++){ //查找最小值 if(a[l][i]<m){ m=a[l][i]; s=l; } } for(int k=s;k<4-1;k++){ //找到最小值后,将其后的值向前移动 a[k][i]=a[k+1][i]; } a[f][i]=m; //将最小值放到最后 } f--; //标志位减一,下一次放到倒数第二位 } for(int i=0;i<5;i++){ //输出第一行 cout<<a[0][i]<<' '; } cout<<endl; for(int i=0;i<5;i++){ //输出第二行 cout<<a[1][i]<<' '; } }
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n=in.nextInt(); while(in.hasNext()){ //for (int m = 0; m < n; m++) { int colLen=5; int rowLen=4; int tnum[][]=new int[rowLen][colLen]; for (int j = 0; j < rowLen; j++) { for (int j2 = 0; j2 < colLen; j2++) { tnum[j][j2]=in.nextInt(); } } int num[][]=new int[colLen][rowLen]; for (int j = 0; j < colLen; j++) { for (int j2 = 0; j2 < rowLen; j2++) { num[j][j2]=tnum[j2][j]; } } int rs1[]=new int[colLen]; int rs2[]=new int[colLen]; int rs1Index=0,rs2Index=0; for (int k = 0; k < colLen; k++) { //System.out.println(Arrays.toString(num[k])); int ttnum[]=num[k]; int index[]={0,1,2,3}; int temp = 0; for (int i = ttnum.length - 1; i > 0; --i) { for (int j = 0; j < i; ++j) { if (ttnum[j + 1] > ttnum[j]) { temp = ttnum[j]; ttnum[j] = ttnum[j + 1]; ttnum[j + 1] = temp; temp = index[j]; index[j] = index[j + 1]; index[j + 1] = temp; } } } // System.out.println(Arrays.toString(ttnum)); // System.out.println(Arrays.toString(index)); if(index[0]<index[1]){ rs1[rs1Index++]=ttnum[0]; rs2[rs2Index++]=ttnum[1]; } else{ rs1[rs1Index++]=ttnum[1]; rs2[rs2Index++]=ttnum[0]; } } // System.out.println(Arrays.toString(rs1)); // System.out.println(Arrays.toString(rs2)); for (int i = 0; i < colLen; i++) { if(i!=colLen-1){ System.out.print(rs1[i]+" "); } else{ System.out.println(rs1[i]); } } for (int i = 0; i < colLen; i++) { if(i!=colLen-1){ System.out.print(rs2[i]+" "); } else{ System.out.println(rs2[i]); } } } //} } }
#include<iostream> #include<limits.h> #include<algorithm> using namespace std; //这题输入用例可太蠢了,完全不是示例1那样的输入,第一行哪有1,而且输出用例也是错的 typedef struct Matrix { int v;//数组元素的值 int row;//行值 }; int main(void) { //int n; Matrix matrix_1[4][5];//输入矩阵 Matrix matrix_2[2][5];//输出矩阵 //while(cin >> n)//这题的输入用例与题意实例1描述不符 //for(int k = 0;k < n;k++) for(int i = 0;i < 4;i++)//输入矩阵数据输入 for(int j =0;j < 5;j++) { int x; cin >> x; matrix_1[i][j].v = x; matrix_1[i][j].row = i; } for(int i = 0;i < 2;i++)//输出矩阵初始化 for(int j = 0;j < 5;j++) matrix_2[i][j].v = INT_MIN; for(int j = 0;j < 5;j++) { for(int i = 0;i < 4;i++)//找到每列第一个最大数 if(matrix_1[i][j].v > matrix_2[0][j].v) matrix_2[0][j] = matrix_1[i][j]; for(int i = 0;i < 4;i++)//找到每列第二个最大数 if(matrix_2[0][j].row != matrix_1[i][j].row && matrix_1[i][j].v > matrix_2[1][j].v) matrix_2[1][j] = matrix_1[i][j]; } for(int j = 0;j < 5;j++)//重新排列输出矩阵,让行值最小的在前 if(matrix_2[0][j].row > matrix_2[1][j].row) swap(matrix_2[0][j], matrix_2[1][j]); for(int i = 0;i < 2;i++) { for(int j = 0;j < 5;j++) cout << matrix_2[i][j].v << ' '; cout << endl; } return 0; }
/* * *最简单的方法是对矩阵的每一列进行排序(最好用结构体记录各列的行标),然后根据行标关系输出最大的两个。 *这里直接利用两次选取最大值模拟过程,然后根据最大与次大下标的关系处理最后的输出。 * */ #include<bits/stdc++.h> using namespace std; int main() { int a[4][5], n; int m[3][5], maxj[5]; //m[1]各列存最大值,m[2]存次大值,m[3]标识两者下标关系,若最大值在下面则为1 memset(m, 0, sizeof(m)); memset(maxj, 0, sizeof(maxj)); //maxj 存各列最大值的(行)下标 for(int i = 0;i < 4; i++) for(int j = 0;j < 5; j++) { cin >> a[i][j]; if(m[0][j] < a[i][j]) //取最大值 { m[0][j] = a[i][j]; maxj[j] = i; } } for(int i = 0;i < 5; i++) for(int j = 0;j < 4; j++) //列优先遍历 { if(j == maxj[i]) continue; if(m[1][i] < a[j][i]) //取次大值 { m[1][i] = a[j][i]; if(j > maxj[i]) m[2][i] = 1; //根据下表关系设置m[3][i] } } for(int i = 1;i >= 0; i--) //输出 注意各列最大值与次大值的下标关系 { for(int j = 0;j < 5; j++) cout << m[abs(m[2][j]-i)][j] << ' '; //abs函数处理 cout << '\n'; } return 0; } /* *下面是方法一的代码。 */ #include<bits/stdc++.h> using namespace std; struct Node //矩阵元素结构体 { int d,index; }; bool cmp(Node a, Node b) { return a.d > b.d; } int main() { Node a[4][5], b[5][4]; int i, j; for(i = 0;i < 4; i++) for(j = 0;j < 5; j++) { cin >> a[i][j].d; a[i][j].index = i; } for(i = 0;i < 4; i++) for(j = 0;j < 5; j++) //转置 b[j][i] = a[i][j]; for(i = 0;i < 5; i++) stable_sort(b[i], b[i]+4, cmp); for(i = 0;i < 2; i++) { for(j = 0;j < 5; j++) { int f = b[j][i].index > b[j][1-i].index; cout << b[j][f].d << ' '; } cout << '\n'; } return 0; }
//不知道为何结果的测试数据不接受对多行的处理 #include <iostream> (720)#include <algorithm> #include <vector> using namespace std; struct Item { int v; int i; bool operator <(const Item& a)const { return v > a.v; } }; int main() { vector<vector<Item> > martrix(5); for(int c = 0; c < 5 ; ++c) { martrix[c].resize(4); } for(int r = 0; r < 4 ; ++r) { for(int c = 0; c < 5 ; ++c) { cin >> martrix[c][r].v; martrix[c][r].i = r; } } for(int c = 0; c < 5 ; ++c) { sort(martrix[c].begin(), martrix[c].end()); if(martrix[c][0].i > martrix[c][1].i) { swap(martrix[c][0].i, martrix[c][1].i); swap(martrix[c][0].v, martrix[c][1].v); } } for(int r = 0; r < 2 ; ++r) { for(int c = 0; c < 5 ; ++c) { cout << martrix[c][r].v << " "; } cout << endl; } return 0; }
#include <iostream> using namespace std; int main(){ int temp,index1,index2; int max[2][5]; int a[4][5]; for(int j=0;j<4;++j) for(int k=0;k<5;++k) cin>>a[j][k]; for(int k=0;k<5;++k){ temp=a[0][k]; index1=0; for(int j=0;j<4;++j) if(a[j][k]>temp){ index1=j; temp=a[j][k]; } if(index1!=0){ index2=0; temp=a[0][k]; }else{ index2=1; temp=a[1][k]; } for(int j=0;j<4;++j){ if(index1==j) continue; else{ if(a[j][k]>temp){ index2=j; temp=a[j][k]; } } } if(index1>index2){ int swap=index2; index2=index1; index1=swap; } max[0][k]=a[index1][k]; max[1][k]=a[index2][k]; } for(int j=0;j<2;++j){ for(int k=0;k<5;++k) cout<<max[j][k]<<' '; cout<<endl; } return 0; }
#include<iostream> #include<algorithm> using namespace std; int jud(int a,int b,int c) { int re=0; if(c>=a&&c>=b) a>b? re=2:re=1; else if(c>=a&&c<=b) re=3; else if(c<=a&&c>=b) re=4; return re; } int main() { int n; int a[4][5]; int b[2][5]; for(int i=0;i<4;i++) for(int j=0;j<5;j++) { cin>>a[i][j]; if(i==0) b[0][j]=a[i][j]; //初始化直接取前两行 else if(i==1) b[1][j]=a[i][j]; else{ switch(jud(b[0][j],b[1][j],a[i][j])) //判断大小,如何交换 { case 0: break; case 1: swap(b[0][j],b[1][j]);swap(b[1][j],a[i][j]);break; case 2: swap(b[1][j],a[i][j]);break; case 3: swap(b[0][j],b[1][j]);swap(b[1][j],a[i][j]);break; case 4: swap(b[1][j],a[i][j]);break; } } } for(int i=0;i<2;i++) { for(int j=0;j<5;j++) cout<<b[i][j]<<" "; cout<<endl; } }
//必须吐槽一波,这给的样例就很不规范嘛,主体思路就是遍历每一列 //如果更新最大值时应该把次大的一起更新,如果不是最大再判断是不是比次大的大,如果更大则更新 //同时记录最大和次大的行列值,然后赋值给输出数组 #include<iostream> using namespace std; int main() { int a[4][5], out[2][5]; while (cin >> a[0][0]>>a[0][1]>>a[0][2]>>a[0][3]>>a[0][4]) { for (int i = 1; i < 4; i++) for (int j = 0; j < 5; j++) cin >> a[i][j]; for (int i = 0; i < 5; i++) { int mid = -999999, big = -999999, pos_m = 0, pos_b = 0; for (int j = 0; j < 4; j++) { if (a[j][i] > big) { mid = big; big = a[j][i]; pos_b = j; } else { if (a[j][i] > mid) { mid = a[j][i]; pos_m = j; } } } if (pos_m > pos_b) { out[0][i] = big; out[1][i] = mid; } else { out[0][i] = mid; out[1][i] = big; } } for (int i = 0; i < 2; i++) { for (int j = 0; j < 4; j++) cout << out[i][j] << " "; cout << out[i][4] << endl; } } }
#include <iostream> #include <vector> using namespace std; const int INF=-999999999; int main() { vector<int> result1,result2; int a[5][5]; for(int i=0;i<4;i++) { for(int j=0;j<5;j++) { cin>>a[i][j]; } } for(int j=0;j<5;j++) { int tempMax1=INF; int tempMax2=INF; int pos1=-1,pos2=-1; for(int i=0;i<4;i++) { if(a[i][j]>tempMax1) { tempMax1=a[i][j]; pos1=i; } } for(int i=0;i<4;i++) { if(a[i][j]>tempMax2&&i!=pos1) { tempMax2=a[i][j]; pos2=i; } } if(pos1<pos2) { result1.push_back(tempMax1); result2.push_back(tempMax2); } else { result1.push_back(tempMax2); result2.push_back(tempMax1); } } for(int i=0;i<result1.size();i++) cout<<result1[i]<<" "; cout<<endl; for(int i=0;i<result2.size();i++) cout<<result2[i]<<" "; return 0; }
#include<iostream> using namespace std; int main(){ int i=0,j=0; int a[4][5]={0}; for(i=0;i<4;i++){ for(j=0;j<5;j++){ cin>>a[i][j]; } } //查找每列两个最小的值 for(j=0;j<5;j++){ int m1=a[0][j],m2=a[1][j]; for(i=1;i<4;i++){ if(a[i][j]<=m2) m2=a[i][j]; if(a[i][j]<=m1){ m2=m1; m1=a[i][j]; } } //最小的往后移 for(int k=0;k<4;k++){ if(a[k][j]==m1&&k+1<=3){ a[k][j]=a[k+1][j]; a[k+1][j]=m1; } } //次小的往后移 for(int l=0;l<3;l++){ if(a[l][j]==m2&&l+1<=2){ a[l][j]=a[l+1][j]; a[l+1][j]=m2; } } } //输出 for(j=0;j<5;j++){ cout<<a[0][j]<<" "; } cout<<endl; for(j=0;j<5;j++){ cout<<a[1][j]<<" "; } return 0; }
#include <iostream> #include <vector> using namespace std; int main(){ int matrix[4][5]; vector<int> firstLine; vector<int> secondLine; while (cin >> matrix[0][0] >> matrix[0][1] >> matrix[0][2] >> matrix[0][3] >> matrix[0][4]){ for (int i = 1; i<4; i++){ cin >> matrix[i][0] >> matrix[i][1] >> matrix[i][2] >> matrix[i][3] >> matrix[i][4]; } for (int i = 0; i<5; i++){ int firstMax=0, secondMax=0; int firstIndex=0, secondIndex=0; for (int j = 0; j<4; j++){ if (firstMax<matrix[j][i]){ firstMax = matrix[j][i]; firstIndex = j; } } for (int j = 0; j<4; j++){ if (secondMax<matrix[j][i] && j != firstIndex){ secondMax = matrix[j][i]; secondIndex = j; } } if (firstIndex<secondIndex){ firstLine.push_back(matrix[firstIndex][i]); secondLine.push_back(matrix[secondIndex][i]); } else{ firstLine.push_back(matrix[secondIndex][i]); secondLine.push_back(matrix[firstIndex][i]); } } for (int i = 0; i<firstLine.size(); i++){ cout << firstLine[i] << " "; } cout << endl; for (int i = 0; i<secondLine.size(); i++){ cout << secondLine[i] << " "; } cout << endl; } }
int main(){int a[4][5];
import java.util.Arrays;
import java.util.Scanner;
/**
* @author Special
* @time 2018/02/18 23:35:16
*/
public class Main {
static final int ROW = 4;
static final int COL = 5;
static final int MAX = Integer.MIN_VALUE;
static int[][] nums = new int[ROW][COL];
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
while(input.hasNext()) {
for(int i = 0; i < ROW; i++) {
for(int j = 0; j < COL; j++) {
nums[i][j] = input.nextInt();
}
}
int[][] result = new int[2][COL];
for(int i = 0; i < 2; i++) {
Arrays.fill(result[i], Integer.MIN_VALUE);
}
for(int i = 0; i < ROW; i++) {
for(int j = 0; j < COL; j++) {
if(nums[i][j] > result[0][j] || nums[i][j] > result[1][j]) {
if(result[0][j] > result[1][j]) {
result[1][j] = nums[i][j];
}else {
result[0][j] = result[1][j];
result[1][j] = nums[i][j];
}
}
}
}
for(int i = 0; i < 2; i++) {
for(int j = 0; j < COL; j++) {
System.out.print((j == 0 ? "" : " ") + result[i][j]);
}
System.out.println();
}
}
}
}
/*********************************
* 来源:2005年华中科技大学计算机保研机试真题
* 总结:注意:每个数字后面都要输出一个空格
**********************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <limits.h>
typedef struct Matrixs{
int value;//数值
int row;//行数
}Matrixs;
int main()
{
int i,j,n,k,first;
Matrixs Matrix[4][5];
Matrixs Matrix2[2][5];
while(scanf("%d",&n) != EOF){
for(k = 0;k < n;k++){
//输入数据
for(i = 0;i < 4;i ++){
for(j = 0;j < 5;j++){
scanf("%d",&Matrix[i][j].value);
Matrix[i][j].row = i;
}
}
//最大的两个数放在前两位
Matrixs temp;
for(j = 0;j < 5;j++){
//初始化最小值
Matrix2[0][j].value = INT_MIN;
Matrix2[1][j].value = INT_MIN;
//每列最大的两个数
for(i = 0;i < 4;i++){
if(Matrix[i][j].value > Matrix2[0][j].value){
Matrix2[0][j] = Matrix[i][j];
}
}
for(i = 0;i < 4;i++){
if(Matrix2[0][j].row != Matrix[i][j].row && Matrix[i][j].value > Matrix2[1][j].value){
Matrix2[1][j] = Matrix[i][j];
}
}
}
//保留原矩阵的行列顺序
for(j = 0;j < 5;j++){
if(Matrix2[0][j].row > Matrix2[1][j].row){
temp = Matrix2[0][j];
Matrix2[0][j] = Matrix2[1][j];
Matrix2[1][j] = temp;
}
}
//输出
for(i = 0;i < 2;i++){
for(j = 0;j < 5;j++){
printf("%d ",Matrix2[i][j].value);
}
printf("\n");
}
}
}
return 0;
}