您的位置:首页 > 其它

ZCMU-1853-zbj的游戏

2017-01-26 19:42 239 查看

1853: zbj的游戏

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 38  Solved: 10

[Submit][Status][Web
Board]

Description

这天zbj跟小伙伴们玩了一个游戏,他们总共有n个人,有一条长凳,上面最多能坐m个人。

zbj和他的小伙伴们按照1-n编号,然后按顺序坐上长凳,然后每次长凳上的第k个那个人会被out当一个人被out之后,下一个人就可以坐上长凳,而每个人有自己喜欢的数字ai,他就会坐在第ai个位置。重复步骤直到长凳上的人数小于k

现在zbj想知道,他们这群人的out顺序是怎么样的?

Input

多组输入数据。对于每组输入数据,第一行是两个整数n,m,k(1<=m<n<=11000 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

【解析】

这道题之前一直在想,本来之前是开了三个数组,一个记录长凳上人的编号,一个是记录每个站着的人喜欢的位置,另一个记录out的人。然而一直没有搞清楚k的范围真的很坑...之后看了别人的代码才知道..其实就是用vector来进行删除和插入操作来进行模拟,这里注意k是小于等于m的,而站起来的人只有n-m个。所以可能n-m个人out结束了但还没有结束。这里vector的插入操作其实就是把它插入到那个位置其余的往后移,其实这里喜欢的位置就是指把这个人插入到这个位置而不是和那个位置的人进行交换..之前这个意思我也弄错了..

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>a;
int main()
{
int n,m,k,p,flag,i;
while(~scanf("%d%d%d",&n,&m,&k))
{
flag=0;
a.clear();
for(i=1;i<=m;i++)
a.push_back(i);
for(i=m+1;i<=n;i++)
{
scanf("%d",&p);
if(flag==1)
{
printf(" ");
}
else
{
flag=1;
}
printf("%d",*(a.begin()+k-1));
a.erase(a.begin()+k-1);//第k个就是要删除
a.insert(a.begin()+p-1,i);//插入元素在喜欢的位置
}
while(a.size()>=k)//元素还多余k没有喜欢的位置了就直接第k个出去就好了
{
if(flag==1)
{
printf(" ");
}
else
{
flag=1;
}
printf("%d",*(a.begin()+k-1));
a.erase(a.begin()+k-1);
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: