1 条题解
-
0
题意分析
题目描述了一种叫做"Hanafuda shuffling"的洗牌方法,要求模拟这个过程并找出最终牌堆顶部的牌。 1.输入说明: 每组数据包含:两个整数n和r(n表示牌的总数,r表示洗牌操作的次数),接下来的r行,每行两个整数p和c,表示一次洗牌操作:从顶部数第p张牌开始,取出c张牌放到牌堆顶部,输入以0 0结束。
2.输出要求: 对于每组数据,输出经过所有洗牌操作后牌堆顶部的牌的数字
3.关键点: 初始时牌堆从底部到顶部编号为1到n(底部是1,顶部是n),每次操作将指定位置的c张牌移到顶部
解题思路
1.初始化牌堆:
创建一个数组表示牌堆,初始时(因为底部是1,顶部是n)
2.处理每次洗牌操作:
从位置p开始,取出c张牌临时保存,将p之前的牌向后移动c个位置,将临时保存的c张牌放到牌堆顶部
3.优化实现: 使用临时数组保存要移动的牌,注意数组索引的处理(题目中的p是从1开始计数),确保移动操作不会越界
4.输出结果:
经过所有洗牌操作后,输出card[1](顶部牌)
代码实现
#include<iostream> using namespace std; int main() { int n,r; int card[51]; int temp[51]; int p,c; while(1) { cin>>n>>r; if(n==0&&r==0) break; int t=n; for(int i=1;i<=n;i++) { card[i]=t; t--; } for(int j=0;j<r;j++) { cin>>p>>c; for(int m=p,n=1;n<=c;m++,n++) { temp[m]=card[m]; } int x=p+c-1; for(int m=p-1;m>=1;m--) { card[x]=card[m]; x--; } for(int m=p,n=1;n<=c;m++,n++) { card[n]=temp[m]; } } cout<<card[1]<<endl; } return 0; }
- 1
信息
- ID
- 979
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者