HDU 2319 Card Trick (模拟)
Problem Description
The magician shuffles a small pack of cards, holds it face down and performs the following procedure:
1.The top card is moved to the bottom of the pack. The new top card is dealt face up onto the table. It is the Ace of Spades.
2.Two cards are moved one at a time from the top to the bottom. The next card is dealt face up onto the table. It is the Two of Spades.
3.Three cards are moved one at a time…
4.This goes on until the nth and last card turns out to be the n of Spades.
This impressive trick works if the magician knows how to arrange the cards beforehand (and knows how to give a false shuffle). Your program has to determine the initial order of the cards for a given number of cards, 1 ≤ n ≤ 13.
Input
On the first line of the input is a single positive integer, telling the number of test cases to follow. Each case consists of one line containing the integer n.
Output
For each test case, output a line with the correct permutation of the values 1 to n, space separated. The first number showing the top card of the pack, etc…
Sample Input`2
4
5`
Sample Output`
2 1 4 3
3 1 4 5 2`
题意:
你的手中有1~n这n张扑克牌,但是这些牌的顺序是不确定的,你需要在这些牌上进行一些操作
1.第一次你从最上面拿出一张牌放到最下面,然后把当前的第一张牌上面的数字记下来并把这张牌拿出 去
2.第二次你要先从最上面取出一张牌放到最下面,再从最上面取出一张牌放到最下面,然后把当前的第一张牌上面的数字记下来并把这张牌拿出去
3.依次进行n次,不同之处在于第i次取最上面牌再放到最下面的操作要进行i次
最后要求你一次记下的这些牌的序列为1到n,让求手中牌的原始序列。
方法一
一种完全逆序的思维,可能比较难以理解一些:
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int v[1000];
queue<int>q;
int m,i;
scanf("%d",&m);
for(i=1; i<=m; i++)
q.push(i);//将这些数字按照正确的顺序存储到队列中
int op;
int m1=1;
while(!q.empty())
{
for(i=1; i<=m1; i++)//依次进行相应的取放操作
{
op=q.front();
q.pop();
q.push(op);
}
int b=q.front();
q.pop();
v[b]=m1;/*让次数当作数组的值,取出来的数字当下标,
因为这样是一种与题意要求相反的顺序,
所以输出的时候下标当取出顺序,数组值当取出的数字,
就正好是与提上要求的正序
*/
m1++;
}
printf("%d",v[1]);
for(i=2;i<=m;i++)
printf(" %d",v[i]);//所有的都是反的!!!!!!
printf("\n");
}
return 0;
}
方法二:
完全逆序模拟题上的操作步骤,最后队列的逆序即为所求:
#include <iostream>
#include <queue>
using namespace std;
int main()
{
int n,a,t,b[15];
queue<int> Q;
cin>>n;
while(n--)
{
cin>>a;
//逆序将每一张牌放入进去,然后进行相应的操作
Q.push(a);//第一次也要进行n次循环,但是只有一个数,没有循环的必要
for(int i=1; i<a; i++)
{
Q.push(a-i) //放入一张新的牌;
for(int j=a-i; j>=1; j--) //进出a-i次
{
t=Q.front();
Q.pop();
Q.push(t);
}
}
int q=0;
while(!Q.empty()) //因为要逆序将队列中的值输出来,先把队列打印出来
{
b[q++]=Q.front();
Q.pop();
}
for(int i=q-1; i>0; i--)//逆序输出
cout<<b[i]<<" ";
cout<<b[0]<<endl;
}
return 0;
}
HDU 2319 Card Trick (模拟)的更多相关文章
- 【HDOJ】2319 Card Trick
水题,STL双端队列. /* 2319 */ #include <iostream> #include <cstdio> #include <cstring> #i ...
- UESTC 890 Card Trick(DP 纸牌魔术)
题意 给你一些牌 所有正面朝下放桌子上 你选一个起点 翻开那张牌 牌上的数字是几就向前走几步 J,Q,K 都是向前走10步 A向前走11步 知道向前走相应的步数后超过了终点 ...
- ny714 Card Trick
Card Trick 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 The magician shuffles a small pack of cards, holds ...
- SPOJ 1108 Card Trick 暴力模拟
解释一下样例,因为我觉得这个题意表述的不是很清楚.以第二组样例为例. 牌序为:3 1 4 5 2 第一轮:把 3 放到末尾:1 4 5 2 3,最顶上的牌是1,把1拿走.剩余 4 5 2 3 第二轮: ...
- POJ 2200 A Card Trick(模拟)
题目链接 题意 : 一共52张牌(A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K)花色分别是C,D,H,S ...给助理5张牌,然后助理需要重新排一下次序,把第一张牌给观 ...
- HDU 5510---Bazinga(指针模拟)
题目链接 http://acm.hdu.edu.cn/search.php?action=listproblem Problem Description Ladies and gentlemen, p ...
- HDU 3328 Flipper 栈 模拟
首先想说,英语太烂这题读了很长时间才读懂......题意是说输入有几张牌,然后输入这些牌的初始状态(是面朝上还是面朝下),然后输入操作方式,R表示翻一下右边的牌堆,L表示翻一下左边的牌堆,直到最后摞成 ...
- HDU 5047 Sawtooth(大数模拟)上海赛区网赛1006
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5047 解题报告:问一个“M”型可以把一个矩形的平面最多分割成多少块. 输入是有n个“M",现 ...
- HDU 5965 扫雷 【模拟】 (2016年中国大学生程序设计竞赛(合肥))
扫雷 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...
随机推荐
- 复利计算1.0,2.0,3.0(java)
程序源代码: import java.util.Scanner; public class ch { public static void main(String[] args) { Scanner ...
- Scrum冲刺博客汇总
第一篇 Scrum冲刺博客 http://www.cnblogs.com/LZTZ/p/8886296.html 第二篇 Scrum冲刺博客 http://www.cnblogs.com/LZTZ/p ...
- laraven安装记录
版本4.2.11 下载地址:https://codeload.github.com/laravel/laravel/zip/v4.2.11 步骤: 1.解压到目录 2.下载composer,并放到/u ...
- excel表中判断A列与B列内容是否相同,相同的话在C列按条件输出!
判断两列数据是否相同,有以下几个函数判断(做笔记于此,方便以后查找): 1.=IF(AND(A4=B4),"相同","") 在C列输出相同字符 2.=IF(A1 ...
- 【经典数据结构】Trie
在计算机科学中,trie,又称前缀树或字典树,是一种有种树,用于保存关联数组,其中的键通常是字符串.与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定.一个节点的所有子孙都有相同的前 ...
- SQL Server中使用自定义指定顺序排序
比如需要对SQL表中的字段NAME进行如下的排序:张三(Z)李四(L)王五(W)赵六(Z) 如果想按 “ 张三.李四.王五.赵六”的顺序排序,则可以使用以下语句: order by charindex ...
- Java开发Excel POI getPhysicalNumberOfCells 与 getLastCellNum的区别
1.getPhysicalNumberOfCells 与 getLastCellNum的区别 用org.apache.poi的包做excel导入,无意间发明若是excel文件中有空列,空列后面的数据全 ...
- [CF1111C]Creative Snap
题目大意:有一个长度为$2^n(n\leqslant30)$的格子,有$k(k\leqslant10^5)$个球,分布在这些格子中,有两种消灭格子的方法: 1. 若一段格子长度大于等于$2$,可以对半 ...
- 【BZOJ4651】【NOI2016】网格(Tarjan,哈希)
[BZOJ4651][NOI2016]网格(Tarjan,哈希) 题面 BZOJ 洛谷 题解 首先把题目稍微变得好说一些,给定一个网格,已经删去了若干个格子 问最少删去多少个格子使得图不连通. 这题的 ...
- 【bzoj4004】装备购买
Portal-->bzoj4004 Solution 这题的话..其实就是求\(n\)个\(m\)维向量的极大线性无关组,并且要求权值最大 然后套路什么的跟Portal-->bzoj310 ...