7 条题解

  • 3
    @ 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;
    }
    
    • 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;
      }
      
      • 1
        @ 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;
        }
        
        • 0
          @ 2025-10-30 23:47:39
          #include<iostream>
          #include<queue>
          using namespace std;
          int main(){
          	int n;
          	cin>>n;
          	while(n--){
          		int m,x;;
          		cin>>m>>x;
          		queue<int>q;
          		for(int i=1;i<=m;i++){
          			q.push(i);
          			
          		}
          		int g=0;
          		while(q.size()>1){     //cout<<q.size()<<"!"<<'\n';
          			g++;
          			if(g==x){
          				q.pop();
          				g=0;
          			}else{
          			int aa=q.front();
          			q.push(aa);
          			q.pop();          //**
          			}
          		}
          		int bb=q.front();
          		cout<<bb<<'\n';
          		
          		
          	}
          	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);
                		}
                	}
                } 
                
                
                
                
                
                • 1

                信息

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