演算法題中對於多組輸入的處理
阿新 • • 發佈:2019-01-11
對於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的時候結束輸入。
第三種,未告知有多少組資料,但告知每組輸入中有多少個數據,當一組輸入中全為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時結束輸入。
#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測評機中,採用的是“管道原理”(胡謅一個名詞),測評機是能夠一次性把所有的資料讀入,然後再將所有輸出結果吐出,與標準答案進行比對。