CF 358C C. Dima and Containers 离线+模拟

题目要求在三种数据结构Queue、Stack和Deck中进行操作,包括元素插入和特定条件下非受限端的弹出。每个操作2时,需要确保弹出的数之和最大化。解决方案是将每两个0之间的数分开处理,对于Deck,选择每次弹出前三个最大的数,最大值放入Queue,次大值放入Stack,第三大值放入Front,其余放入Back。使用vector进行模拟实现这一策略。
摘要由CSDN通过智能技术生成

题意: 有3种数据结果,Queue,Stack,Deck(两端插入) 和 Q次操作 

操作1:把数字x压入3种数据结构中的其中一种. 

操作2: 遇到输入x==0 将弹出3个数据结构中的非受限端 (Queue为队头,Stack为栈顶).并且清空该数据结构.(Deck 只能选其中一端) 并且要求每次操作2弹出的数之和要最大.

1<=Q,x<=1e6.


每遇到操作2后 所用数据都清空 所以将两个0之间的数 分开来考虑.

因为Deck只能弹出一个数 所以可以选择其一端放没用的数 .那么显然可以每次遇到操作2都弹出前3大的数.

最大放queue,次大放stack,第三大放Front 剩余的都放Back. 用vector模拟一下即可.


#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef pair<int,int> ii;
const int N=2e+5;
int mk[5];
vector<ii> v;
string s[4]={"Queue","Stack","Front","Back"};
bool cmp(ii a,ii b)
{
	return a.se<b.se;
}
void calc()
{
	int ans=0;
	vector<int> res(v.size());
	sort(v.begin(),v.end());
	reverse(v.begin(),v.end());
	for(int i=0;i<v.size();i++)
		res[v[i].se]=3;
	for(int i=0;i<min(3,(int)v.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值