最近在做OJ题目的时候,遇到这种要求
“输入数据有多组”
作为一个资深受害者,我总结了以下几种情况
第一种,最简单的,告知有多少组数据,每组输入中包含救命的n,然后是n个数据。
例如:输入m组数据,每组数据n个。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int m;
int n;
cin >> m;
while(m--) {
cin >> n;
vector<int> a=(n,0); //动态分配内存,贼la好用
for (int j = 0; j<n; j++)
cin >> a[j];
}
return 0;
}
第二种,未告知有多少组数据,每组输入中包含救命的n,然后是n个数据,当n为0的时候结束输入。
例如:每组数据包含n以及n个数,当n为0的时候结束输入。(这种就比较隐式)
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
while (cin >> n && n) {
vector<int> a=(n,0);
for (int i = 0; i != n; i++)
cin >> a[i];
}
return 0;
}
第三种,什么都不说,只管输入,甚至没告诉怎么结束的。(多见于字符串处理)
例如:输入多组字符串(和输入无关的一个字都不多写╭(╯^╰)╮)。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s;
while (cin >> s) {
//TODO
}
return 0;
}
最后正经地总结一下,对于此类题目,是可以采取“输入一组输出一组”方法处理的,大家不用想到“我一定要等多组数据全部输入以后再一次性输出”的这种刁钻的角度。实际上,在OJ或ACM测评机中,采用的是“管道原理”(胡诌一个名词),测评机是能够一次性把所有的数据读入,然后再将所有输出结果吐出,与标准答案进行比对。