码迷,mamicode.com
首页 > 其他好文 > 详细

补番计划 (长沙理工大学第十一届程序设计竞赛)(双端队列+set容器+string)

时间:2016-04-17 23:03:48      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

补番计划

Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 8   Accepted Submission(s) : 1

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

阿聪是一个日漫狂魔。暑假在家的时候,他有12小时在补番,12小时在睡觉。
但是动漫的质量有好有坏,选择看哪一部动漫一直都是一个问题。
于是,他做了一个补番的队列,每一次当他完结某部动漫后,他会选择队列最前面的那部动漫观看,并从队首删除。
阿聪想补的番通常有2个途径。一个是来自网上网友的推荐,他会把网友推荐的动漫放在队列的末尾。
另一种是来自现实朋友的推荐,他会把朋友推荐的动漫直接放在队列最前面。
阿聪有时候也会在贴吧里听到有人说某部动漫一点也不好看,或者是无意中被透剧了,这个时候阿聪就会很生气的把这部动漫从队列中删除。

Input

第一行有一个整数T(T<=5),表示测试组数
接下来有T组数据
每一组数据第一行有一个数字Q(Q<=10000),表示这组数据中的操作数。
接下来Q行中,分别有下面几种格式
0
1 [动漫名字]
2 [动漫名字]
3 [动漫名字]

Output

0表示阿聪现在要补番了,如果队列为空,则输出-1,否则取出队列的队首的动漫名字,并将它从队首中删除,如果这部动漫阿聪已经看过了, 则同样输出-1,否则输出动漫名字并换行,并标记为看过了
1表示网友推荐阿聪了一部动漫,阿聪把这部动漫加入到了队列末尾
2表示朋友推荐阿聪了一部动漫,阿聪把这部动漫加入到了队列首端
3表示阿聪不想看这部动漫了,他会从队列中删除所有这部动漫的(只会删除在这个操作之前已存在队列中的,并不会影响后面的操作)
注意动漫名字都是用[]括起来的,名字中只含有下划线数字字母并区分大小写,且2<=动漫名字长度<=50

Sample Input

2
7
0
1 [Sword_Art_Online]
1 [Your_Lie_in_April]
2 [sakura_sou_no_pet_na_kanojo]
0
0
0
6
1 [Your_Lie_in_April]
1 [Your_Lie_in_April]
2 [Is_the_order_a_rabbit]
3 [Is_the_order_a_rabbit]
0
0

Sample Output

-1
sakura_sou_no_pet_na_kanojo
Sword_Art_Online
Your_Lie_in_April
Your_Lie_in_April
-1



虽然没学过c++  。。

感觉应该和java差不多。。。

题意中因为要从队尾  队首加入 所以选用---------------------双端队列

为了判断是否看过某番 ,为了番名的唯一性----------------set容器

剩下的就是模拟了

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <set>
using namespace std;
int main()
{
	set<string>s;
	deque<string>q;
	int ncase,n;
	scanf("%d",&ncase);
	while(ncase--)
	{
		s.clear();
		while(!q.empty())
		q.pop_back();
		cin>>n;
		for(int i=0;i<n;i++)
		{
			int x;
			cin>>x;
			if(x==0)
			{
				if(!q.empty())
				{
					string x1=q.front();q.pop_front();
					if(s.find(x1)==s.end())
					{
						cout<<x1<<endl;
						s.insert(x1);
					}
					else
					{
						cout<<-1<<endl;
					}
					
				}
				else
				{
					cout<<-1<<endl;
				}
			}
			if(x==1)
			{
				string x2;
				cin>>x2;
				q.push_back(x2.substr(1,x2.length()-2));
			}
			if(x==2)
			{
				string x2;
				cin>>x2;
				q.push_front(x2.substr(1,x2.length()-2));
			}
			if(x==3)
			{
				string x2;
				cin>>x2;
				x2=x2.substr(1,x2.length()-2);
				int count=q.size();
				while(count--)
				{
					string x3=q.front();q.pop_front();
					if(x3.compare(x2)!=0)
					{
						q.push_back(x3);
					}
				}
			}
		}
	
	}
	return 0;
}

 

补番计划 (长沙理工大学第十一届程序设计竞赛)(双端队列+set容器+string)

标签:

原文地址:http://blog.csdn.net/su20145104009/article/details/51170818

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!