您的位置:首页 > 大数据 > 人工智能

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

2018-02-25 14:22 627 查看
题意: 有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.size());i++)
res[v[i].se]=i,ans++;
sort(v.begin(),v.end(),cmp);
for(int i=0;i<v.size();i++)
cout<<"push"<<s[res[i]]<<"\n";
cout<<ans;
for(int i=0;i<ans;i++)
cout<<" pop"<<s[i];
cout<<"\n";
res.clear();
}
int main()
{
ios::sync_with_stdio(false);
//cin.tie(0);
//cout.tie(0);
int Q,x,id=0;
cin>>Q;
for(int i=0;i<Q;i++)
{
cin>>x;
if(x)
v.push_back(ii(x,id++));
else
{
calc();
id=0;
v.clear();
}
}
if(v.size())
for(int i=0;i<v.size();i++)
cout<<"pushQueue"<<"\n";
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: