原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=348
题意: 给你n张牌,由你来变一个魔术。(我开始搞错了,wrong了,郁闷了半天。)
第一次:将最上面的一张牌,依次放到牌底部,然后 把现在最上面的一张牌放在桌子上,他是 1;
第二次:将最上面的二张牌,依次放在牌底部,然后 把现在最上面的一张牌放在桌子上,他是 2;
第三次: 将最上面的三张牌,依次放在牌底部,然后 把现在最上面的一张牌放在桌子上,他是 3;
............
执行n次,每次放在桌子上的牌依次是1,2,3,4,5......n;
求原先牌放的顺序。。依次输出。。。ok ,理解了题意,就很easy了。。
说一下我的思路:
根据题上的描述,倒着模拟题上的过程。。每次从牌顶部增加,底部删除,顶部增加,要适合这个操作,而且还要执行起来方便,我想到了队友说过的双向队列。其实我还不会这玩意,只是听过而已,于是立刻去百度双向队列,看了一下删除和增加的操作。。发现这个题现在来看很easy了,于是立刻水上。。O(∩_∩)O哈哈~。。
简单说一下双向队列:
贴一下我的ac代码:
//双向队列
#include<stdio.h>
#include<deque>
#include<string.h>
using namespace std;
int main()
{
int a,b,n,m,k,ncase;
scanf("%d",&ncase);
while(ncase--)
{
deque<int>D;
scanf("%d",&m);
n=m;
for(a=1;a<=n;a++)
{
D.push_front(m);
b=m;
while(b--)
{
k=D.back();
D.pop_back();
D.push_front(k);
}
m--;
}
while(!D.empty())
{
printf("%d ",D.front());
D.pop_front();
}
printf("\n");
}
}