HDU-2020 海选女主角

HDU-2020 海选女主角

题目:
potato老师虽然很喜欢教书,但是迫于生活压力,不得不想办法在业余时间挣点外快以养家糊口。
“做什么比较挣钱呢?筛沙子没力气,看大门又不够帅…”potato老师很是无奈。
“张艺谋比你还难看,现在多有钱呀,听说还要导演奥运开幕式呢!你为什么不去娱乐圈发展呢?”lwg在一旁出主意。
嗯,也是,为了生存,就委屈点到娱乐圈混混吧,马上就拍一部激光电影《杭电记忆——回来我的爱》。
说干就干,马上海选女主角(和老谋子学的,此举可以吸引媒体的眼球,呵呵),并且特别规定,演员必须具有ac的基本功,否则直接out!
由于策划师风之鱼(大师级水王)宣传到位,来应聘的MM很多,当然包括nit的蛋糕妹妹等呼声很高的美女,就连zjut的jqw都男扮女装来应聘(还好被安全顾问hdu_Bin-Laden认出,给轰走了),看来娱乐圈比acm还吸引人哪…
面试那天,刚好来了mn个MM,站成一个mn的队列,副导演Fe(OH)2为每个MM打了分数,分数都是32位有符号整数。
一开始我很纳闷:分数怎么还有负的?Fe(OH)2解释说,根据选拔规则,头发染成黄色、化妆太浓、穿的太少等等都要扣分数的,扣的多了就可能是负分了,当然,如果发现话语中夹有日语,就直接给-2147483648分了。
分数送上来了,是我做决定的时候了,我的一个选拔原则是,要选一个面试分数绝对值(必须还是32位整数)最大的MM。
特别说明:如果不幸选中一个负分的MM,也没关系,因为我觉得,如果不能吸引你,那要想法恶心你。
Input
输入数据有多组,每组的第一行是两个整数m和n,表示应聘MM的总共的行列数,然后是m行整数,每行有n个,m和n的定义见题目的描述。
Output
对于每组输入数据,输出三个整数x,y和s,分别表示选中的MM的行号、列号和分数。
note:行号和列号从一开始,如果有多个MM的分数绝对值一样,那么输出排在最前面的一个(即行号最小的那个,如果行号相同则取列号最小的那个)。
Sample Input
2 3
1 4 -3
-7 3 0
Sample Output
2 1 -7

#include<iostream>
#include<cstdio>
#include<cmath> 
using namespace std;
#define M 100000

int main()
{
	int m,n,max,x,y;
	int a[M];
	while(scanf("%d %d",&m,&n) != EOF)
	{
		if(!m && !n) break;
		for(int i = 0;i < (m * n);i++)
		{  
			scanf("%d",&a[i]);
		}
		max = 0;
		x = 1;
		y = 1;
		for(int i = 0;i < (m * n);i++)
		{
			if(abs(a[i]) > abs(a[max]))
			{
				x = i / n + 1;
				y = i % n + 1;	
				max = i;
			}
		}
		cout << x << " " << y << " " << a[max] << endl;
	} 
	return 0;
}

解题步骤:
这道题要求先输入行数和列数,随后在输入每行每列的值。一开始,本人打算使用二维数组去存储这些值,后来因为觉得进行绝对值的最大值比较不方便所以放弃了。假如要输入n行m列的数组,可以把它看成一维数组,那么此时一位数组的存储的大小就是n * m了。存储好这些数据之后,要定义一个max变量(max代表数组元素的绝对值最大的下标),首先要把max初始化为0(就是假设刚开始最大的元素是首元素),然后就进行for循环和之后元素的绝对值进行比较,如果有元素比max大,则把其下标赋给max,并且分别用x和y记录这个元素在整个行列中的位置(也就是行数和列数),行数就是x = i / n + 1; 列数就是y = i % n + 1;。
但是此时提交的案例依然是wa,因为当我们输入2行2列的元素时,并且这些元素都是1。那么根据题意此时的最大元素的位置应该是第1行第1列。但是因为所有元素都相同,所以for循环中的if语句不执行。所以要避免这个错误就需要在在每次for循环之前需要给行和列进行赋值,全都赋值为1。(就是因为这个地方,导致一直wa。。。。。)

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41998938/article/details/83214040