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