8 条题解

  • 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
        @ 2025-11-27 0:37:46
        #include <stdio.h>
        int find(int m, int x) {
        	int flag[1000] = {0}; //用1来标记去除
        	int count = 0;          
        	int cnt = m;          
        	int ans = 0;          
        	while (cnt > 1) {
        		while (flag[ans] == 1) {
        			ans = (ans + 1) % m; 
        		}		
        		count++;		
        		if (count == x) {
        			flag[ans] = 1; 
        			cnt--;
        			count = 0;         
        		}		
        		ans = (ans + 1) % m;
        	}	
        	for (int i = 0; i < m; i++) {
        		if (flag[i] == 0) {
        			return i + 1;
        		}
        	}
        }
        int main() {
        	int n;
        	scanf("%d", &n);
        	for (int i = 1; i <= n; i++) {
        		int m, x;
        		scanf("%d%d", &m, &x);
        		printf("%d\n", find(m, x));
        	}	
        	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
                  标签
                  (无)
                  递交数
                  389
                  已通过
                  198
                  上传者