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

补番计划

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


Statistic | Submit | Back

虽然没学过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;
}
时间: 2024-10-07 21:22:31

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

最长子串(长沙理工大学第十一届程序设计竞赛 离线 做了n天.....崩溃了)

最长子串 Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65535/65535K (Java/Other) Total Submission(s) : 27   Accepted Submission(s) : 4 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 小E最近开始研究数列,于是小J就给他出了一道题目:给你一个长度为n

开锁魔法II 哈尔滨理工大学第五届ACM程序设计竞赛

规律:a[i][j]=     1/i * a[i-1][j-1]      +      (i-1)/i * a[i-1][j];  (少一个盒子时使用j-1 次魔法的概率)   (少一个盒子时使用j次魔法的概率) 公式推导如下: 设a[i][j]为打开i个盒子正好需要j次魔法的情况. ① 1->1 ② 1->1 , 2->2;        两次 1->2 , 2->1;        一次 ③ 1->1 , 2->2 , 3->3;     三次 1-

12.28西南民族大学第十一届程序设计竞赛(同步赛)

A了9题 不太行 虽然前期速度还行,由于有道poj原题写过直接粘了,但中期由于被B卡了,心态有点炸.后面也做不太动. 来补两道题. B题: 题意:求最短的让所有字符都至少出现一次的字符串的长度 https://ac.nowcoder.com/acm/contest/3570/B 比赛里一直想的假算法,什么维护每个字符第一次出现,最后一次出现的位置,那答案在中间呢? 枚举长度,端点,check,TLE,真敢写.真的sb,太假了. 然后这题赛后看了别人代码,发现类似个滑动窗口,动态的去维护呀,虽然我

2015年江西理工大学C语言程序设计竞赛(初级组)

JankTao相亲记 解法:排序 #include<stdio.h> #include<string.h> #include<iostream> #include<math.h> #include<map> #include<set> #include<vector> #include<algorithm> using namespace std; const double INF = 1e20; const

2016年江西理工大学C语言程序设计竞赛(初级组)

Problem Description 华盛顿在寝室洗衣服,遭到了xyf的嫌弃,于是xyf出了道题给华盛顿来做(然而并没有什么关系-v-!)xyf扔给华盛顿n个字符串,这些字符串的长度不超过10000并且没有空串.有Q个询问,每个询问一个k,求出这n个字符串中的子串包含了第k个字符串的个数(详情请看hint) Input 多组测试.每组测试先输入n,Q表示n个字符串,Q个询问.(1<= n ,Q <=1e4)接下来n行每行一个字符串si,(1<= |si| <= 1e4)再接下来Q

2015年江西理工大学C语言程序设计竞赛(高级组)

A 解法:DP+二分 dp[i]=max(dp[i],dp[j]+p[i].v)(i>j) dp[i]表示建立i点之后能够获得的最大值 int n,M; struct node { int l,v; }p[1010]; int dp[1010]; bool cmp(node a,node b){ return a.l < b.l; } bool judge_oo(){ int Max = -1; for(int i = 1;i <= n;i++) Max = max(Max,p[i].v

福州大学第十一届程序设计竞赛

Problem 2167 大王叫我来巡山呐 Problem 2168 防守阵地 I 直接前缀和预处理 Problem 2169 shadow  .. Problem 2170 花生的序列 dp Problem 2171 防守阵地 II 线段树搞搞 Problem 2172 巡了南山我巡北山 http://blog.csdn.net/my_acm_dream/article/details/44507371 好题 Problem 2173 Nostop 矩阵高速幂 Problem 2174 卷福的

2013年江西理工大学C语言程序设计竞赛(初级组)

ACM ICPC WORLD FINAL 解法:排序大家都知道,去重的话,初学者用数组就好了 #include<algorithm> #include<iostream> using namespace std; int main() { int a,b,c[100],i,d[31]; cin>>a; while(a>0) { cin>>b; for(i=0;i<31;i++) d[i]=0; for(i=0;i<b;i++) { cin&

福州大学第十一届程序设计竞赛菜鸟的题解

前几天去了两个比较牛的互联网公司面试,在sql这块都遇到问题了,哎,可惜呀,先把简单的梳理一下 成绩表 score 1.group by 使用 按某一个维度进行分组 例如: 求每个同学的总分 SELECT student,SUM(score) FROM score GROUP BY student 求每个同学的平均分 SELECT student,AVG(score) FROM score GROUP BY student 也可以按照 班级,课程 来求 2.having 与 where的区别 h