C++程序设计 第8周 编程题1# list

总结的问题:

1. OpenJudge上老师提供的测试数据一共有20万多行,一开始只想着复制粘贴到控制台黑框中,结果电脑内存不够导致粘贴过去的数据不完整。网上搜索“如何输入大量的测试数据”(可能是我的关键字不对),搜索出的结果都不对。突然想起之前有重定向输入输出的课程,翻出来重新学习了一遍,果然找到了很简单的方法。

2. unique函数是去掉连续重复的元素,必须要先排序一遍才能去掉所有的重复元素。

---------------------以下是题目------------------------

描述

写一个程序完成以下命令:

new id ——新建一个指定编号为id的序列(id<10000)

add id num——向编号为id的序列加入整数num

merge id1 id2——合并序列id1和id2中的数,并将id2清空

unique id——去掉序列id中重复的元素

out id ——从小到大输出编号为id的序列中的元素,以空格隔开

输入

第一行一个数n,表示有多少个命令( n<=200000)。以后n行每行一个命令。

输出

按题目要求输出。


C++程序设计 第8周 编程题1# list_第1张图片

有一点疑惑,整个程序我都没有理会new命令,会不会有什么风险呢?

另外,OpenJudge和Coursera的要求竟然不一样,OPJ上是要求一次性录入命令然后一次性输出结果,而Coursera要求每录入一条命令就处理一条,输出和输入是相互交错的。可惜单从题目上是看不出来的区别的。。。。这就是为啥很多童鞋在OPJ上通过了,可是Coursera死也不认的原因。

以下是针对OPJ上的要求,Coursera上的要求相对简单一点。

#include
#include
#include  
#include
#include
using namespace std;

int GetNum(string &s)//用来读取命令后面的数字的,包括id和num
{
	int pos=s.rfind(" ");
	string num = s.substr(pos + 1, s.length() - 1 - pos);
	s.erase(pos);
	return stoi(num);
}


int main()
{
	//以下两行是用来读取和输出测试数据的
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);
	int n; cin >> n;
	cin.get();
	vector command(n);
	string tmp;
	for (int i = 0; i < n; i++)
	{
		getline(cin, tmp);
		command[i]=tmp;
	}
	vector> lst(10000);
	for (int i = 0; i < n; i++)//判断是否是add命令
	{
		if (command[i].at(0)=='a')
		{
			int num = GetNum(command[i]);
			int id = GetNum(command[i]);
			lst[id-1].push_back(num);
		}
		else if (command[i].at(0) == 'm')//判断是否是merge命令
		{
			int id2 = GetNum(command[i]);
			int id1 = GetNum(command[i]);
			lst[id1 - 1].merge(lst[id2 - 1]);
		}
		else if (command[i].at(0) == 'u')//判断是否是unique命令
		{
			int id = GetNum(command[i]);
			lst[id - 1].sort();
			lst[id - 1].unique();
		}
		else if (command[i].at(0) == 'o')//判断是否是out命令
		{
			int id = GetNum(command[i]);
			lst[id - 1].sort();
			
			ostream_iterator o(cout, " ");
			copy(lst[id - 1].begin(), lst[id - 1].end(), o);
			cout << endl;
		}
	}
	return 0;
}



你可能感兴趣的:(C++)