#include<bits/stdc++.h> using namespace std; int n;//表示D和R的数量 char a[200005];//用来存储输进来的数据 queue<int> d,r;//定义两个队列分别用来存放D和R的 int main() { while(~scanf("%d",&n))//输入D和R总数量 { scanf("%s",a);//输入整个字符 for(int i=0;i<n;i++) { if(a[i]=='D') d.push(i);//分开两个队列 else r.push(i); } while(!r.empty()&&!d.empty())//该题的核心代码 { int R=r.front();//如果没有被吃掉的话,就将这个字母移到对列的末尾 int D=d.front(); if(R<D) { r.pop(); d.pop(); r.push(n+R); } else { d.pop(); r.pop(); d.push(n+D); } } if(!r.empty()) printf("R\n");//如果r队列有剩余的话,那么就说明R赢了 else printf("D\n"); } return 0; }
时间: 2024-03-18 18:46:05 浏览: 30
万能头文件#include&amp;lt;bits/stdc++.h&amp;gt; using namespace std;
这段代码的作用是解决一个名为约瑟夫问题(Josephus problem)的经典问题。问题描述如下:有n个人(编号为0~n-1),坐成一个环状,从第0个人开始报数,报到m-1的人出环,剩下的人继续从0开始报数,直到剩下一人,求这个人的编号。
该代码通过输入D和R的数量,以及一个由D和R组成的字符串,将D和R分别存储到队列d和队列r中,并且通过模拟约瑟夫问题的过程,最终输出D或R胜利的结果。
阅读全文