1853: zbj的游戏
Time Limit: 1 Sec Memory Limit: 128 MB[ Submit][ Status][ Web Board]
Description
这天zbj跟小伙伴们玩了一个游戏,他们总共有n个人,有一条长凳,上面最多能坐m个人。
zbj和他的小伙伴们按照1-n编号,然后按顺序坐上长凳,然后每次长凳上的第k个那个人会被out当一个人被out之后,下一个人就可以坐上长凳,而每个人有自己喜欢的数字ai,他就会坐在第ai个位置。重复步骤直到长凳上的人数小于k
现在zbj想知道,他们这群人的out顺序是怎么样的?
Input
多组输入数据。对于每组输入数据,第一行是两个整数n,m,k(1<=n<m<=10000 1<=k<=m)。接下来一行有n-m个整数ai(1<=ai<=m),按顺序代表站着的人喜爱的数字。
Output
输出out的顺序,输出为一行,每两个数字之间用空格隔开,行末无空格。
Sample Input
5 2 2
1 2 2
Sample Output
2 1 4 5
HINT
比如5个人玩游戏,长凳上只能坐2个人,k=2,那么1号2号先坐在了凳子上,第一轮,2号被out,3号坐下,3号喜欢的数字是1,那么3号坐在了第一个位置上,当前长凳上的顺序变成了3号 1号;第二轮,1号被out,4号坐下,4号喜欢的数字是2,那么4号坐在第二个位置上,当前长凳上的顺序变成了3号 4号;第三轮,4号被out,5号坐下,5号喜欢的数字是2,当前长凳上的顺序变成了3号 5号;第四轮,5号被out,无人坐下;第五轮,当前长凳上只有1个人<k,所以无人能被out,所以游戏结束。
out顺序为2 1 4 5
【分析】
约瑟夫的变化版...每次出局之后会新增人的约瑟夫...vector的基本应用了..插入就插入..删除就删除..删除之前输出一下删除的是谁就可以了..
【代码】
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
vector <int> a;
int main()
{
int n,m,x,k;
while (~scanf("%d%d%d",&n,&m,&k))
{
a.clear();
int t=0;
for (int i=1;i<=m;i++) a.push_back(i);
for (int i=m+1;i<=n;i++)
{
scanf("%d",&x);
if (t) printf(" ");else t=1;
printf("%d",*(a.begin()+k-1));
a.erase(a.begin()+k-1);
a.insert(a.begin()+x-1,i);
}
while(a.size()>=k)
{
if (t) printf(" ");else t=1;
printf("%d",*(a.begin()+k-1));
a.erase(a.begin()+k-1);
}
printf("\n");
}
return 0;
}