5 条题解

  • 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
        @ 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
            标签
            (无)
            递交数
            325
            已通过
            160
            上传者