1. 程式人生 > >演算法題中對於多組輸入的處理

演算法題中對於多組輸入的處理

對於OJ或ACM剛剛入門的朋友們,也許會遇到這種要求

“輸入資料有多組”

驚不驚喜,意不意外?

不會的朋友這個時候咋辦啊,百度吧,找到一堆羅裡吧嗦的回答,越找越難受。

是我的話,我就生氣,雖然我當時就是這麼做的。

不過,希望看到這裡的你,能夠馬上結束你的難受,希望隔著螢幕的你們,也能感受到我送出的微薄溫暖。

(有人感動了嗎?我的眼眶已經溼潤了。)

============================================================================

第一種,最簡單的,告知有多少組資料,每組輸入中包含救命的n,然後是n個數據。

例如:輸入m組資料,每組資料n個。

#include<iostream>
using namespace std;

int main()
{
	int m;
	int n;
	cin >> m;
	for (int i = 0; i != m; i++) {
		cin >> n;
		int* a = new int[n];
		for (int j = 0; j != n; j++)
			cin >> a[j];
		//TODO
	}
	return 0;
}

還在為如何動態分配陣列而頭疼嗎?

程式碼中的 int* a = new int[n]; 輕鬆幫你解決問題,動態分配大小為n的陣列供你使用。

一但用過這種方法,就再也離不開它了。

第二種,未告知有多少組資料,每組輸入中包含救命的n,然後是n個數據,當n為0的時候結束輸入。

例如:每組資料包含n以及n個數,當n為0的時候結束輸入。

#include<iostream>
using namespace std;

int main()
{
    int n;
    while (cin >> n && n) {
        int* a = new int[n];
        for (int i = 0; i != n; i++)
            cin >> a[i];
        //TODO
    }
    return 0;
}
第三種,未告知有多少組資料,但告知每組輸入中有多少個數據,當一組輸入中全為0時結束輸入。

例如:輸入多個學生的三科成績,當輸入全為0時結束輸入。

#include<iostream>
using namespace std;

int main()
{
	int a, b, c;
	while (cin >> a >> b >> c && (a || b || c)) {
		//TODO
	}
	return 0;
}
第四種,什麼都不說,只管輸入,甚至沒告訴怎麼結束的。(多見於字串處理)

例如:輸入多組字串(和輸入無關的一個字都不多寫╭(╯^╰)╮)。

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
	string s;
	while (cin >> s) {
		//TODO
	}
	return 0;
}

最後正經地總結一下,對於此類題目,是可以採取“輸入一組輸出一組”方法處理的,大家不用想到“我一定要等多組資料全部輸入以後再一次性輸出”的這種刁鑽的角度。實際上,在OJ或ACM測評機中,採用的是“管道原理”(胡謅一個名詞),測評機是能夠一次性把所有的資料讀入,然後再將所有輸出結果吐出,與標準答案進行比對。