2019ICPC(南昌) - Magic Master(模拟)

题目链接:点击查看

题目大意:桌子上有按顺序排列n张牌,我们需要循环进行以下操作,直到牌没有

  1. 拿走第一张牌
  2. 将最后一张牌拿到最前面的位置,循环m次
  3. 拿走第一张牌

然后给出q次询问,每次询问第k张牌是什么时候拿出来的

题目分析:比赛的时候不知道被谁带偏了,一直在考虑约瑟夫环,其实这就是个简单模拟,只是用vector写完后一直RE,连本地都跑不过,赛后看了别人的代码,发现真的好简单,偷学一波deque,感觉自己已经是stl依赖症晚期了,懒死了

对了,这个题给的数据范围是4e8,如果用一个deque模拟,用一个数组存结果的话,会爆内存,所以只能用一个deque模拟最后的结果,也可以在一个数组上操作,我看网上有大佬推出来的结论是,倒着从n遍历,将每个数字插入到最前端,然后执行m次循环,这样能直接得到答案,真的太强了。。反向模拟

上代码吧:模拟即可

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;

const int inf=0x3f3f3f3f;
   
const int N=1e8+100;

dequeq;

int main()
{
    int w;
    cin>>w;
    while(w--)
    {
    	int n,m;
    	scanf("%d%d",&n,&m);
    	q.clear();
    	q.push_front(n);
    	for(int i=n-1;i>1;i--)
    	{
    		q.push_front(i);
    		for(int i=1;i<=m;i++)
    		{
    			q.push_front(q.back());
    			q.pop_back();
			}
		}
		q.push_front(1);
		int t;
		scanf("%d",&t);
		while(t--)
		{
			int x;
			scanf("%d",&x);
			printf("%d\n",q[x-1]);
		}
	}
    
    
    
      
      
      
      
      
      
      
      
      
      
    return 0;
}

 

你可能感兴趣的:(模拟)