201712-2游戏

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//此代码运行超时,仅供参考,下一个是正确代码
#include <stdio.h>
int main(){
	int num=1,n,k,l=0,a[1000];  //l为每轮淘汰小朋友人数 
	scanf("%d%d",&n,&k);
	for(int i=0;i<n;i++)
	    a[i]=i+1;               //初始化数组,给所有小朋友编号 
	
	while(n!=1){                //一直循环直到剩余一人 
		for(int index=0;index<n;index++){   //index为数组下标 
			
			if(num%k==0||num%10==k){
				l++;                       //符合淘汰条件,淘汰人数加一 
			}
			else                          //如果轮到他未被淘汰 
			    a[index-l]=a[index];      //则将他前移l位 
		num++;
		}	 
		
		n=n-l; //本轮淘汰完剩余人数 
		l=0;   //将淘汰人数清零 
	}

	printf("%d",a[0]);  //最后数组里只剩下一个元素a[0],即获胜小朋友编号 
	return 0; 
}

这是第一次写的,写完还挺高兴。
在这里插入图片描述
运行超时90分,题目要求在1s内解决。我寻思着难道是因为时间复杂度整成n^2了,这可咋改啊?苦思冥想又请教了一下大神:整成队列就完事了。

#include<algorithm>
#include<cstdio>
#include<queue>

using namespace std;

int main(){
	int num=1,n,k,w;        //w为最后获胜小朋友编号 
	queue<int> c;           //c为children队列 
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
	c.push(i);              //初始化队列,给所有小朋友编号 
	
	while(!c.empty()){      //一直循环直到最后一个小朋友也出队 
		w=c.front();        //得到当前小朋友编号 
		c.pop();            //将这个小朋友移出队列 
		if(num%k==0||num%10==k);    //若符合淘汰条件,啥都不做 
		else  c.push(w);            //本轮不被淘汰,则把他加到队尾                         
		num++;
		}	 

	printf("%d",w);         //最后记录的w即获胜小朋友编号 
	return 0; 
}

如此看来,队列竟然比双重循环快一点,学到了。
欢迎交流指导。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值