本文主要是介绍hdu4841圆桌问题(STL),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
圆桌上围坐着2n个人。其中n个人是好人,另外n个人是坏人。如果从第一个人开始数数,数到第m个人,则立即处死该人;然后从被处死的人之后开始数数,再将数到的第m个人处死……依此方法不断处死围坐在圆桌上的人。试问预先应如何安排这些好人与坏人的座位,能使得在处死n个人之后,圆桌上围坐的剩余的n个人全是好人。
2 3 2 4
GBBGBGGB
用vector模拟圆桌,初始化时将每个人进行编号,然后取出坏人时进行标记,最后按照标记输出结果
AC代码
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
int vis[80000]; //用于标记的数组
int main()
{int n,m,temp,h;while(cin>>n>>m){vector<int>g;for(int i=1;i<=2*n;i++)g.insert(g.end(),i); //输入对应的编号memset(vis,0,sizeof vis);temp=0;for(int i=0;i<n;i++){int f=g.size();
//取出编号if(temp+m<f)h=*(g.begin()+temp+m-1);else if(temp+m>f&&(temp+m)%f!=0)h=*(g.begin()+(temp+m)%f-1);elseh=*(g.begin()+f-1);
//标记vis[h]=1;if(temp+m<f){g.erase(g.begin()+temp+m-1);temp=temp+m-1;}else if(temp+m>f&&(temp+m)%f!=0){g.erase(g.begin()+(temp+m)%f-1);temp=(temp+m)%f-1;}else{g.erase(g.begin()+f-1);temp=0;}}
//输出结果for(int i=1;i<=2*n;i++){if(vis[i])cout<<'B';elsecout<<'G';if(i%50==0&&i!=2*n)cout<<endl;}cout<<endl<<endl; //最后的换行}return 0;
}
这篇关于hdu4841圆桌问题(STL)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!