Problem A: STL——整理唱片
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3424 Solved: 790
[ Submit][ Status][ Web Board]
Description
小明有一个书架,但是他却用它放了许多唱片。但是他的习惯很不好,唱片胡乱摆放。于是他决定整理一下他的唱片。为了方便起见,小明用一个整数表示他对一张唱片的喜爱程度。
小明会对书架上的唱片进行的整理可以细化成如下操作:
1:在第一个喜爱程度为i唱片后放入一张喜爱程度为j的新唱片;
2:拿走所有的喜爱程度小于等于i唱片,因为小明无法忍受喜爱程度小于等于i的唱片
3:将所有喜爱程度为i的唱片拿出,并将一张喜爱程度为i的新唱片放入第一张喜爱程度为j的唱片后面。
输出小明整理完后的唱片排列情况(显示唱片的喜爱程度即可)
注:对于非法操作应该自动忽略,如情况1不存在要求的喜爱程度i,则自动忽略,不应该影响结果。
Input
输入有多组情况,每组第一行为n,表示唱片数,下一行有n个数字,表示各个唱片首小明的喜爱程度。下一行为m,小明的操作次数,一下m行每行开始包含一个数字t,表示题目中描述的操作种类,后面跟着一到两个数字,表示题目描述中的i和j
Output
每组情况输出一行,表示唱片整理后的情况,最后一个数字后木有空格。(n,m<=1000)
Sample Input
5 1 2 3 4 5 3 1 5 6 3 1 3 2 4
Sample Output
5 6
HINT
用STL的list容易解决。
#include<iostream>
#include<list>
#include<iterator>
using namespace std;
int main()
{
list<int> s;
list<int>::iterator q;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int p;
cin>>p;
s.push_back(p);
}
int m;
cin>>m;
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a;
if(a==1)
{
cin>>b>>c;
for(q=s.begin();q!=s.end();q++)
{
if(*q==b&&q!=s.end())
{
// list<int>::iterator it = q;
s.insert(++q,c);
break;;
}
}
}
else if(a==2)
{
cin>>b;
for(q=s.begin();q!=s.end();)
{
if(*q<=b)
s.erase(q++);
else
q++;
}
}
else if(a==3)
{ cin>>b>>c;
s.remove(b);
for(q=s.begin();q!=s.end();q++)
{
if(*q==c&&q!=s.end()){
//list<int>::iterator it = q;
s.insert(++q,b);
}
}
}
}
for(q=s.begin();q!=s.end();q++)
{
if(q==s.begin())
cout<<*q;
else
cout<<" "<<*q;
}
cout<<endl;
}