游戏

 

 

这道题目比较简单,刚开始我直接暴力模拟,AC!

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 //15:30~15:50
 5 const int N=1003;
 6 int ans[N]={0};
 7 int main()
 8 {
 9     int n,k,num;
10     num=0;
11     cin>>n>>k;
12     int a=n; 
13     for(int i=0;i<n;i++)
14         ans[i]=i+1;    //给n个小朋友编号 
15     while(a!=1)
16     {
17         for(int i=0;i<n;i++)
18         {
19             if(ans[i]!=0)
20             {
21                 num++;    //报数 
22                 if(num%k==0||num%10==k)
23                 {
24                     ans[i]=0;        //淘汰
25                     a--;
26                 } 
27             }
28             if(a==1)    break;
29         } 
30 
31     }
32     for(int i=0;i<n;i++)
33     {
34         if(ans[i]!=0)
35         {
36             cout<<i+1;break;
37         }
38     }
39 } 

但是后来觉得这样不文明,于是上网搜索大佬们的解法

大多数人采用的是队列模拟,我感觉高级了许多,于是借用过来学习学习。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 queue <int> q;
 5 int main()
 6 {
 7     int n,k,num=1;    //num为当前报数
 8     cin>>n>>k;
 9     for(int i=0;i<n;i++) 
10         q.push(i+1);        //给每个小朋友编号 
11     while(q.size()!=1)
12     {
13         int t=q.front();    //获取队列q的队首小朋友编号 
14         q.pop();        //令队首小朋友暂时出队,判定是否淘汰
15         if(!(num%k==0||num%10==k))        //不满足淘汰条件
16             q.push(t);                //入队 
17         num++;
18     } 
19     cout<<q.front();    //使用q.front()访问队首元素。 
20     return 0;
21 } 

这种方法思路简洁多了,完美利用出队入队过程模拟循环报数。

 

 

 

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 queue <int> q;
 5 int main()
 6 {
 7     for(int i=1;i<6;i++)
 8         q.push(i);
 9     for(int i=1;i<=3;i++)
10         q.pop();
11     cout<<q.front(); 
12     return 0;
13 } 

 

转载于:https://www.cnblogs.com/ManOK/p/10461546.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值