6 条题解

  • 2
    @ 2023-11-22 0:52:46
    //1996ms 
    //用队列解决 
    #include<stdio.h>
    #include<queue>
    using namespace std;
    int main()
    {
    	int t;
    	scanf("%d",&t);
    	while(t--){
    		int m,x,w;//m人数,x目标数,w用来存放数列第一个数 
    		scanf("%d%d",&m,&x);
    		queue <int> s;//定义数列s 
    		for(int i=1;i<=m;i++){
    			s.push(i);//将每个人放入队列 
    		}
    		for(int i=1;;i++){
    			int num=s.size();//检测队列中人数 
    			if(i%x==0){//每当向下进行到第x个人,将他删去 
    				s.pop();
    			}
    			else{
    				w=s.front();//核心:非第x个时将前方的人逐个从末尾压入队列 
    				s.pop();
    				s.push(w);
    			}
    			if(num==1){//当队列仅剩一人输出 
    				break;
    			}
    		}
    		int ed=s.front();//输出最后剩余的1个 "幸存者"
    		printf("%d\n",ed);
    	}
    	return 0;
    }
    
    • 2
      @ 2023-11-6 20:06:55

      直接从最后一个人逆向往回筛。

      #include <stdio.h>
      
      int main()
      {
      	int t;
      	scanf("%d",&t);
      	while (t--)
        {
      	int m,n,i,a=0;
      //m是人数,i是剩余人数,n是报号
          scanf("%d %d", &m, &n);
          for (i = 1; i <= m; i++)
          {
              a = (a + n) % i;//从零开始记录每次过滤报号的人数,不能大于当前剩余人数
      //当i==m时,逆着看就是每次都在去除一次报号n的人,直到把人数筛的没有人    
      //那再多一个人就是剩下的人了
           }    
      printf("%d\n", a + 1);  }    
      return 0;
      }
      
      • 0
        @ 2025-9-20 23:16:52

        纯模拟

        from math import sqrt,ceil,gcd,log;re=lambda:map(int,input().strip().split())
        n, = re()
        for _ in range(n):
            m, x = re()
            a = list(range(1, m + 1))
            curr = 0
            while len(a) > 1:
                curr = (curr + x - 1) % len(a)
                a.pop(curr)
            print(a[0])
        
        
        • 0
          @ 2024-12-8 23:46:33
          include<iostream>
          using namespace std;
          
          int main()
          {
          	int n;
          	cin>>n;
          	while(n--)
          	{
          		int x,m;
          		cin>>m>>x;
          		int a[m+1];
          		for(int i=1;i<=m;i++)
          		{
          			a[i] = i;
          		}
          		int end = m;//用于控制和观察数组中不为零的个数
          		int j = 1;
          		int sum = 0;
          		while(end!=1)
          		{
          			if(j==m+1)
          			{
          				j=1;//保持循环;
          			}
          			if(a[j]>0)
          			{
          				sum++;//判断数组中大于零的数的个数,就是没被剔除的数的个数
          			}
          			if(sum == x)
          			{
          				a[j]=0;
          				end--;
          				sum = 0;
          			}
          			j++;
          		}
          		for(int i=1;i<=m;i++)
          		{
          			if(a[i]>0)
          			{
          				cout<<a[i]<<endl;
          			}
          		}
          	}
          
          • 0
            @ 2023-11-17 21:03:47
            #include<stdio.h>
            int a[10000];
            int main()
            {
            	int t;
            	scanf("%d",&t);
            	while(t--)
            	{
            		int n,m;
            		scanf("%d %d",&n,&m);//n=6 m=4 
            		int j=1,i=0;
            		int k=n;
            		for(int l=0;l<n;l++)
            		a[l]=0;
            		while(1)
            		{   
            		if(a[i%n]>=0)
            		a[i%n]=j;
            		
            		if(j==m&&a[i%n]>=0)
            		{
            			a[i%n]=-1;
            			j=1;
            			k--;
            			
            		}//printf("%d %d\n",i%n+1,a[i%n]);
            		if(a[i%n]>=0)
            		j++;
            		i++;
            		if(k==1)
            		break;
            		}
            		for(int i=0;i<n;i++)
            		{
            			if(a[i]>=0)
            			printf("%d\n",i+1);
            		}
            	}
            } 
            
            
            
            
            
            • 0
              @ 2023-10-7 23:05:30
              #include <stdio.h>
              int main() 
              {
              	int n,m,x;
              	scanf("%d",&n);
              	while(n--)
              	{
                  scanf("%d%d",&m,&x);
                  int p[m],c=0,count,M=m;
                  for (int i=0;i<m;i++)
                  p[i]=i+1;//每个人报的数
                  while (m>1) 
              	{
                      count=0;//被筛掉的人的数量
                      for(;count<x;) 
              		{
                          if (p[c]!=0)
                          count++;
                          if(count==x)
                          {p[c]=0;m--;}//等于0则被筛掉
                          c=(c+1)%M;
                      }
                  }
                  int i=0;
                  while(p[i]==0)
                  i++;//求没有被筛的人的位置
                  printf("%d\n",p[i]);
              	}
                  return 0;
              }
              
              • 1

              信息

              ID
              198
              时间
              3000ms
              内存
              128MiB
              难度
              4
              标签
              (无)
              递交数
              336
              已通过
              166
              上传者