算法中对于多组数据的处理


最近在做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测评机中,采用的是“管道原理”(胡诌一个名词),测评机是能够一次性把所有的数据读入,然后再将所有输出结果吐出,与标准答案进行比对。

原文链接请戳这里


文章作者: 再也不会
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 再也不会 !
  目录