★实验任务
开学了,有 N 个新生需要排成一列。这 N 个新生编号从 1 到 N,为了排队方便,按编号
从 1 到 N 顺序入队伍,起始队伍为空,每个人进队伍的选择有两种,一种是直接排在当前队
伍的最前面,一种是排在当前队伍最末端。现在想知道所有人都入队伍之后每人的后面是谁。 ★数据输入
输入第一行为一个正整数 N (2 < N < 10000), 表示有 N 个人,编号为 1 到 N。。
接下来 1 行,有 N 个整数,0 或者 1。第 i 个数表示第 i 个同学是排在当前队伍最前端
还是在最末端。(0 表示排在当前队伍最前端,1 表示排在当前队伍最末端)
★数据输出
输出 N 行每行一个整数。第 i 行的整数表示全部人都入队伍后第 i 个同学后面的同学的
0
1
0
1
0
4
1
6
3
开学了,有 N 个新生需要排成一列。这 N 个新生编号从 1 到 N,为了排队方便,按编号
从 1 到 N 顺序入队伍,起始队伍为空,每个人进队伍的选择有两种,一种是直接排在当前队
伍的最前面,一种是排在当前队伍最末端。现在想知道所有人都入队伍之后每人的后面是谁。 ★数据输入
输入第一行为一个正整数 N (2 < N < 10000), 表示有 N 个人,编号为 1 到 N。。
接下来 1 行,有 N 个整数,0 或者 1。第 i 个数表示第 i 个同学是排在当前队伍最前端
还是在最末端。(0 表示排在当前队伍最前端,1 表示排在当前队伍最末端)
★数据输出
输出 N 行每行一个整数。第 i 行的整数表示全部人都入队伍后第 i 个同学后面的同学的
编号,如果后面没人的同学则输出 -1。 输入示例 输出示例
input:
60
1
0
1
0
1
output:
24
1
6
3
-1
利用双端队列可以很轻松解决此题
#include<iostream>
#include<deque>
#include<algorithm>
using namespace std;
int main()
{
int n,flag,i;
deque<int> Q;
deque<int>::iterator iter;
while(cin>>n)
{
for(i=1;i<=n;i++)
{
cin>>flag;
if(flag==0) //一次将第i个同学插入到队首或者队尾
Q.push_front(i);
else Q.push_back(i);
}
for(i=1;i<=n;i++)
{
iter=find(Q.begin(),Q.end(),i); //找到第i个同学的位置
if((++iter)!=Q.end()) //下一个同学的位置
cout<<*iter<<endl;
else cout<<-1; //如果后面没有人了,则输出-1
}
}
return 0;
}