1. 程式人生 > >HDU-2020 海選女主角

HDU-2020 海選女主角

HDU-2020 海選女主角

題目:
potato老師雖然很喜歡教書,但是迫於生活壓力,不得不想辦法在業餘時間掙點外快以養家餬口。
“做什麼比較掙錢呢?篩沙子沒力氣,看大門又不夠帥…”potato老師很是無奈。
“張藝謀比你還難看,現在多有錢呀,聽說還要導演奧運開幕式呢!你為什麼不去娛樂圈發展呢?”lwg在一旁出主意。
嗯,也是,為了生存,就委屈點到娛樂圈混混吧,馬上就拍一部鐳射電影《杭電記憶——回來我的愛》。
說幹就幹,馬上海選女主角(和老謀子學的,此舉可以吸引媒體的眼球,呵呵),並且特別規定,演員必須具有ac的基本功,否則直接out!
由於策劃師風之魚(大師級水王)宣傳到位,來應聘的MM很多,當然包括nit的蛋糕妹妹等呼聲很高的美女,就連zjut的jqw都男扮女裝來應聘(還好被安全顧問hdu_Bin-Laden認出,給轟走了),看來娛樂圈比acm還吸引人哪…
面試那天,剛好來了mn個MM,站成一個m

n的佇列,副導演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。。。。。)

執行結果:
在這裡插入圖片描述