首页 > 试题广场 >

最大的两个数

[编程题]最大的两个数
  • 热度指数:15910 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
    输入一个四行五列的矩阵,找出每列最大的两个数。

输入描述:
每个用例包含四行,每行包括五个整数。代表一个四行五列的矩阵,矩阵元素全部是整数。


输出描述:
    可能有多组测试数据,对于每组数据,按照样例输出的格式将每列最大的两个数输出,如果最大的两个数中的一个数在这一列中有多个相同的值,则行值取行值小的那一个。
    输出时要保留原矩阵的行列顺序,即在原矩阵中行值小的,在输出矩阵中的行值依然小。
示例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
示例2

输入

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;
}
发表于 2018-09-19 18:53:11 回复(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;
}
发表于 2018-02-04 14:33:13 回复(3)
终于弄懂了题目所说的行 小先输出是什么意思。刚开始一直理解错误,错误当成第一行输出最大的元素,第二行输出次大的元素。调了两个小时多,原来第一行和第二行是放的最大值和次大值出现的相对顺序。相当于原矩阵只保留列最大值和列次大值,把其余的元素都划掉,之后形成的2X5的数组。
1.找到最大的元素,保留最大值,并将次元素值赋值负无穷大。
2.次大值的找法同上。
根据两数出现的次序,保存结果。
#include<stdio.h>
#include<algorithm>
using namespace std;
struct node
{
    int x, y;
    int data;
};
int main()
{
    int a[4][5];
    while(scanf("%d",&a[0][0])!=EOF)
    {
        for(int j=1; j<5; j++)
            scanf("%d",&a[0][j]);

        for(int i=1; i<4; i++)
          for(int j=0; j<5; j++)
              scanf("%d",&a[i][j]);

        int ans1[10], k1=0;
        int ans2[10], k2=0;
        for(int  j=0; j<5; j++)
        {
            int m1 = -0x3fffffff, index1;
            for(int i=0; i<4; i++)//找最大的数
            {
                if(m1 < a[i][j])
                {
                    m1 = a[i][j];
                    index1 = i;
                }
            }
            a[index1][j] = -0x3fffffff;//将最大值赋值为负无穷大
            int m2 = -0x3fffffff, index2;
            for(int i=0; i<4; i++)
            {

                if(m2 < a[i][j])
                {
                    m2 = a[i][j];
                    index2 = i;
                }
            }
            if(index1 < index2)
            {
                ans1[k1++] = m1;
                ans2[k2++] = m2;
            }
            else
            {
                ans1[k1++] = m2;
                ans2[k2++] = m1;
            }
        }
        for(int i=0; i<5; i++)
            printf("%d ", ans1[i]);
        printf("\n");
        for(int i=0; i<5; i++)
            printf("%d ",ans2[i]);
    }
    return 0;
}



发表于 2019-03-20 20:04:22 回复(1)
#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]<<' ';
    }
}

编辑于 2019-02-20 19:56:06 回复(0)
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]);
					}
				}
				
			}
		//}
	}
}
不通过
您的代码已保存
格式错误:您的程序输出的格式不符合要求(比如空格和换行与要求不一致)
case通过率为0.00%

发表于 2017-02-04 13:07:05 回复(1)
#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;
}

发表于 2021-03-16 16:48:36 回复(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;
}

编辑于 2021-01-19 21:45:21 回复(0)
老年人解法
//initialize Seq[i][j] as the [i]st biggest element
//then travel num and correct Seq
//then print when Seq[i][j]>1

#include <stdio.h>
int main(){
    int num[4][5];
    int Seq[4][5]; 
        for(int i = 0; i < 4; i++) //initialize
            for(int j = 0; j < 5; j++) {
                scanf("%d",&num[i][j]);
                Seq[i][j] = i;
            }
        for(int j = 0; j < 5; j++) //correct
            for(int i = 1; i < 4; i++) 
                for(int p = 0; p < i; p++) {
                    if(num[i][j] < num[p][j]) {
                        Seq[i][j]--;
                        Seq[p][j]++;
                    }
                }
        for(int j = 0; j < 5; j++) //print the first row
            for(int i = 0; i < 4; i++) 
                if(Seq[i][j] > 1) {
                    printf("%d ",num[i][j]);
                    Seq[i][j] = -1;
                    break;
                }
        printf("\n");
        for(int j = 0; j < 5; j++) //print the second row
            for(int i = 0; i < 4; i++) 
                if(Seq[i][j] > 1) {
                    printf("%d ",num[i][j]);
                    Seq[i][j] = -1;
                    break;
                }
        printf("\n");
    return 0;
}
发表于 2020-03-21 15:09:42 回复(0)
对原来的矩阵转置存储,每列都放在同一个vector里面便于排序,取出最大的两个,注意用结构体保存行号即可。
//不知道为何结果的测试数据不接受对多行的处理
#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;
}


发表于 2020-03-13 00:14:41 回复(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;
}


发表于 2020-03-09 18:41:07 回复(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;
    }
}

发表于 2020-01-28 17:51:52 回复(1)
//必须吐槽一波,这给的样例就很不规范嘛,主体思路就是遍历每一列
//如果更新最大值时应该把次大的一起更新,如果不是最大再判断是不是比次大的大,如果更大则更新
//同时记录最大和次大的行列值,然后赋值给输出数组
#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;
		}
	}
}

发表于 2020-01-15 16:49:22 回复(0)
#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;
}

发表于 2019-08-07 10:57:02 回复(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;
}

发表于 2019-02-24 16:36:32 回复(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;
    }
} 

发表于 2018-09-12 19:55:40 回复(0)
#include<stdio.h>

int main(){
    int a[4][5];
    int i,j;
    int M,m;
    int b[5];
    int c[5];
    for(i=0;i<4;i++){
        for(j=0;j<5;j++){
            scanf("%d",&a[i][j]);
        }
    }
    for(j=0;j<5;j++){
        if(a[0][j]>a[1][j]){
            M=a[0][j];
            m=a[1][j];
        }else{
            M=a[1][j];
            m=a[0][j];
        }
        for(i=2;i<4;i++){
            if(a[i][j]>M){
                m=M;
                M=a[i][j];    
            }
            if(a[i][j]>m && a[i][j]<M)
                m=a[i][j];
        }
            i=0;
            while(a[i][j]!=M && a[i][j]!=m)
                i++;
            if(a[i][j]==M){
                b[j]=M;
                c[j]=m;
            }else{
                b[j]=m;
                c[j]=M;
            }
    }
    for(i=0;i<4;i++)
        printf("%d ",b[i]);
    printf("%d",b[4]);
    printf("\n");
    for(i=0;i<4;i++)
        printf("%d ",c[i]);
    printf("%d",c[4]);
    return 0;
}

发表于 2018-06-02 16:48:40 回复(0)
#include<iostream>
#include<vector>
using namespace std;

int main(){
    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];
            }
        }
        int max,max_2; //保存每列的最大值,次最大值
        int max_id,max_2_id;//保存最大值,次最大值的下标
        for(int j=0;j<5;j++)
        {
            max = a[0][j]>=a[1][j]?a[0][j]:a[1][j];
            max_2 = a[0][j]<a[1][j]?a[0][j]:a[1][j];
            max_id =  a[0][j]>=a[1][j]?0:1;
            max_2_id = (max_id == 0)?1:0;
            for(int i=2;i<4;i++){
                if(a[i][j]>max)
                {
                    max_2 = max;
                    max = a[i][j];
                    max_2_id = max_id;
                    max_id = i;
                }else if(a[i][j] >max_2){
                    max_2 = a[i][j];
                    max_2_id = i;
                }
                
            }
            b[0][j] = max_id<max_2_id?max:max_2;
            b[1][j] = max_id<max_2_id?max_2:max;
        }
        
        for(int i=0;i<2;i++){
            for(int j=0;j<4;j++){
                cout<<b[i][j]<<" ";
            }
            cout<<b[i][4]<<endl;
        }
   
}

发表于 2018-05-28 13:10:29 回复(0)
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
      int a[4][5],ans[2][5];
      while(scanf("%d %d %d %d %d",&a[0][0],&a[0][1],&a[0][2],&a[0][3],&a[0][4])!=EOF){
        for(int i=1;i<4;i++){
            for(int j=0;j<5;j++){
                scanf("%d",&a[i][j]);
            }
        }
 int b[4];
      for(int j=0;j<5;++j)
      {
          int max1=0,max2=0;
      for(int i=0;i<4;++i)
          {
              b[i]=a[i][j];
        }
        sort(b,b+4);
        for(max1=0;max1<4;++max1)
        {
            if(a[max1][j]==b[3])
            break;
        }
        for(max2=0;max2<4;++max2)
        {
            if(a[max2][j]==b[2])
            break;
        }
        if(max1<max2)
        {
              ans[0][j]=b[3];
              ans[1][j]=b[2];
          }
          else{
              ans[0][j]=b[2];
              ans[1][j]=b[3];
          }
    }
    for(int i=0;i<2;++i)
    {
        for(int j=0;j<5;++j)
        {
            if(j==0){
                printf("%d",ans[i][j]);
            }
            else printf(" %d",ans[i][j]);
        }
        printf("\n");
    }
}
return 0;
}
发表于 2018-03-06 18:49:22 回复(0)
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();
            }
        }
    }


}
发表于 2018-02-18 23:58:25 回复(0)
/********************************* 
*   来源: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;  
}  
发表于 2017-02-14 16:14:17 回复(4)

问题信息

难度:
137条回答 10690浏览

热门推荐

通过挑战的用户

查看代码