1 条题解

  • 0
    @ 2025-5-10 21:24:42

    题意分析

    题目描述了一种叫做"Hanafuda shuffling"的洗牌方法,要求模拟这个过程并找出最终牌堆顶部的牌。 1.输入说明: 每组数据包含:两个整数n和r(n表示牌的总数,r表示洗牌操作的次数),接下来的r行,每行两个整数p和c,表示一次洗牌操作:从顶部数第p张牌开始,取出c张牌放到牌堆顶部,输入以0 0结束。

    2.输出要求: 对于每组数据,输出经过所有洗牌操作后牌堆顶部的牌的数字

    3.关键点: 初始时牌堆从底部到顶部编号为1到n(底部是1,顶部是n),每次操作将指定位置的c张牌移到顶部

    解题思路

    1.初始化牌堆:

    创建一个数组表示牌堆,初始时card[i]=ni+1card[i] = n-i+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
    上传者