问题描述
面试那天,刚好来了m * n
个MM,站成一个m * n
的队列,副导演Fe(OH)2为每个MM打了分数,分数都是32位有符号整数。
一开始我很纳闷:分数怎么还有负的?Fe(OH)2解释说,根据选拔规则,头发染成黄色、化妆太浓、穿的太少等等都要扣分数的,扣的多了就可能是负分了,当然,如果发现话语中夹有日语,就直接给 -2147483648分 了。
分数送上来了,是我做决定的时候了,我的一个选拔原则是,要选一个面试分数绝对值(必须还是32位整数)最大的MM。
特别说明:如果不幸选中一个负分的MM,也没关系,因为我觉得,如果不能吸引你,那要想法恶心你。
输入数据有多组,每组的第一行是两个整数m和n,表示应聘MM的总共的行列数,然后是m行整数,每行有n个,m和n的定义见题目的描述。
对于每组输入数据,输出三个整数x,y和s,分别表示选中的MM的行号、列号和分数。
注意:行号和列号从一开始,如果有多个MM的分数绝对值一样,那么输出排在最前面的一个(即行号最小的那个,如果行号相同则取列号最小的那个)。
输入样本
2 3
1 4 -3
-7 3 0
输出样本
2 1 -7
解题思路
m * n
个MM,说明这是一个二维数组- 分数是一个32位有符号的整数,说明这是一个整数类型
- 根据题目中,该题中实际要对比的是数字的绝对值,并且如果同一列中,存在相同的变量,去行最小,如果行相同,取列最小
- 如何输入变量到二维数组中?
需要使用两个 for 循环结构,进行嵌套输入数组的变量,一个表示行,一个表示列 - 如何对输入的数组变量变成绝对值进行判定?
需要调用头文件<cmath>
使用abs
函数进行绝对值判定,在使用 if 结构进行判定,但是在这之前需要定义一个变量,用来存储最大绝对值 - 如何输出对应的位置和数组变量?
在最后进行输出的时候,需要对行号和列号,进行加一,并输出行号和列号对应的数组变量 - 问题中提到的当遇到两个相同的变量,取排在最前的行号和列号,怎么处理?
这点可以不用进行处理,因为代码在运行的过程中是从上到下,从左到右,进行依次处理,只要在使用 if 结构在进行判定的时候不要使用大于等于
或小于等于
即可
代码示例
#include <iostream>
#include <cmath> // 调用头文件
using namespace std;int main() {int a[100][100]; // 定义数组变量int m , n; // 定义女主角的变量while(cin >> m >> n){ // 反复输入操作int b = 0 , c , d; // 设定三个变量,一个用来存储最大绝对值,另外两个用来存储行号和列号for(int i = 0 ; i < m ; ++i){ // 使用 for 循环进行二维数组行号的操作cout << endl; // 输出换行符,便于直观查看,可不写for(int j = 0 ; j < n ; ++j){ // 使用 for 循环进行二维数组列号的操作cin >> a[i][j]; // 输入变量到二维数组if(abs(a[i][j]) > b ){ // 若数组绝对值 > 0 进行更换操作b = abs(a[i][j]); // b = 新的数组变量绝对值c = i ; // c = 对应的行号d = j ; // d = 对应的列号}}}cout << (c+1) << ' ' << (d+1) << ' ' << a[c][d] << endl; // 按照输出样本,输出对应的行号和列号,以及对应的变量。}return 0;
}