游戏

 

 

这道题目比较简单,刚开始我直接暴力模拟,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 } 

 

posted @ 2019-03-02 16:13  focusDing  阅读(176)  评论(0编辑  收藏  举报