最大的两个数

最大的两个数

题目描述:

输入一个四行五列的矩阵,找出每列最大的两个数。

输入:

输入第一行包括一个整数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 
提示:

每个数字后面都要输出一个空格

Code:
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    int arr[6][6];
    int n;
    while(cin>>n){
        while(n--){
            for(int i=1;i<=4;++i){
                for(int j=1;j<=5;++j){
                    cin>>arr[i][j];
                }
            }
            int first,second;
            vector<int> tmpVec;
            vector<int> ansVec;
            for(int i=1;i<=5;++i){
                tmpVec.clear();
                for(int j=1;j<=4;++j){
                   tmpVec.push_back(arr[j][i]);
                }
                sort(tmpVec.begin(),tmpVec.end());
                first=tmpVec[3];
                second=tmpVec[2];
                bool notFoundFirst=false;
                bool notFoundSecond=false;
                int index;
                for(int j=1;j<=4;++j){
                    if(arr[j][i]==first||arr[j][i]==second){
                        ansVec.push_back(arr[j][i]);
                        if(arr[j][i]==first){
                            notFoundFirst=true;
                        }else{
                            if(arr[j][i]==second){
                                notFoundSecond=true;
                            }
                        }
                        index=j;
                        break;
                    }
                }
                if(notFoundFirst==true){
                    for(int j=index+1;j<=4;++j){
                        if(arr[j][i]==second){
                            ansVec.push_back(arr[j][i]);
                            break;
                        }
                    }
                }
                if(notFoundSecond==true){
                    for(int j=index+1;j<=4;++j){
                        if(arr[j][i]==first){
                            ansVec.push_back(arr[j][i]);
                            break;
                        }
                    }
                }
            }
            cout<<ansVec[0]<<" "<<ansVec[2]<<" "<<ansVec[4]<<" "<<ansVec[6]<<" "<<ansVec[8]<<" "<<endl;
            cout<<ansVec[1]<<" "<<ansVec[3]<<" "<<ansVec[5]<<" "<<ansVec[7]<<" "<<ansVec[9]<<" "<<endl;
        }
    }
    return 0;
}

/**************************************************************
    Problem: 1200
    User: lcyvino
    Language: C++
    Result: Accepted
    Time:40 ms
    Memory:1520 kb
****************************************************************/

时间: 2024-10-13 22:26:55

最大的两个数的相关文章

如何不运用第三方变量实现两个数的交换

当遇到交换两个变量的时候,我们通常使用的是借助第三方变量实现两个数的交换.那么如果不使用第三方变量时,该怎么操作呢. 下面有两种方法: 1.通过已有的两个变量之间的加或减实现: 这种方法对于两个都是无限接进int取值范围,而相加超出int取值范围的情况不适用. 2.通过异或实现(异或符号为^) ******************************************************************************************************

20150328晚,不使用乘号运算符实现两个数相乘

//20150328晚,不使用乘号运算符实现两个数相乘 #include <stdio.h> #include <stdlib.h> #pragma warning(disable:4996) //using namespace std; int main() { int m, n, t; long long ll, absn, absm; while (scanf("%d %d", &m, &n) != EOF) { absn = n; abs

笔试算法题(09):查找指定和值的两个数 &amp; 构造BST镜像树

出题:输入一个已经升序排序的数组和一个数字:要求在数组中查找两个数,这两个数的和正好等于输入的那个数字,输出任意一对数字就可以,要求时间复杂度是O(n): 分析:对于升序排序的数组{-i-j-k-m--},只有可能是i+m=j+k(j和k可能是同一个数),所以可以从两边往中间收缩而忽视其他交叉相加的情况: 解题: 1 void FindSumFactor(int *array, int length, int sum) { 2 int left=0, right=length-1; 3 whil

请编写一个程序,该程序可以接收两个数,并判断两个数是大于、小于、等于?

//作者:janushu //日期:2017/9/20 //功能判断两个数的大小 import java.io.*; public class CompareToNumDemo{ public static void main(String[] args){ try{ //输入流 从键盘上输入一个数 InputStreamReader isr = new InputStreamReader(System.in); //缓存读取一个数 BufferedReader br = new Buffere

位运算和关于两个数交换的多种方法

我们知道,位运算在计算中有着广泛的应用. 在计算机的各种编程语言中位运算也是一种不可缺少的运算,尤其是在计算机的底层实现代码中. 以下我们就来介绍一下位运算. 1.左移运算<<  左移右移都是移动二进制数 0000-0000 0000-0000 0000-0000 0000-1100     =12 向左移动一位变为(右边缺几位就补几个0) 0000-0000 0000-0000 0000-0000 0001 1000       =24 再向左移一位 0000-0000 0000-0000

写一个方法,求两个数的最大公约数和最小公倍数。

package homework0702; /* * 最大公约数 利用辗转相除法求解两个正整数的最大公约数 在循环中,只要除数不等于0,用较大的数除以较小的数,将小的一个数作为下一轮循环的大数,取得的余数作为下一轮循环较小的数,如此循环直到较小的数值为0,返回较大的数.即为最大公约数. 辗转相除法(欧几里得算法) 定理:两个整数的最大公约数等于其中较小的那个数和两数的相除余数的最大公约数.最大公约数(greatest common divisor)缩写为gcd. 最小公倍数 最小公倍数 = (a

求两个数的最大公约数

求两个数的最大公约数 问题:给定两个正整数a和b,求他们的最大公约数. 最简单的方法就是穷举法,如果a>b,那么依次计算1~b的所有整数是否是a和b的公约数. public static void main(String[] args) { long timer = System.currentTimeMillis(); System.out.println(getGCB(1000234234,1242342390)); System.out.println(System.currentTime

简易的C/S系统(实现两个数的和)

//Client:#include <string.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> int main(int argc, char **argv){ int sockfd; struct sockaddr_in address; int result; int num1 = 25, num2 = 30, num3 = 0; printf("请

JavaScript获取两个数之间的任意随机数

通过JavaScript的Math.random()方法可以获取0到1之间的任意随机数,那如何获取任意给定的两个数之间的随机数呢?如获取2和5之间的随机数,5和10之间的随机数等. 由于Math.random()函数总是返回0到1之间的一个随机数,我们可以把0看成最小数,把1看成最大数.假设最小数是max,最大数是min,通过下面的公式我们便可得出任意两个数之间的随机数: Math.random() * (max - min) + min 如果使用Math.floor()进行向下舍入操作,则需要

【算法C++】检测数组里是否有两个数之和等于某个数

问题: 检测数组里是否有两个数之和等于某个数 解决方法一:先将数组排序,然后从两头开始遍历 数组排序后,从左端开始取最小值,从右端取最大值, 判断两者之和与目标的大小: 1. 等于时,输出两个数: 2. 大于时,右端移到第2个数,继续判断: 3. 小于时,左端移到第2个数,继续判断. #include <iostream> #include <string> #include <algorithm> using namespace std; void fun1(int