题意:有N个人,K张牌,其中有K/N张好牌,其他是坏牌。发牌的人想把好牌都发自己手里,发牌的规则是第一张牌给发牌人右边的一个人,每发一张牌就要把牌堆上的P张牌放到最下面。问好牌应该放在什么地方可以使所有好牌都到发牌人手中
思路:模拟
错误:当start为k的时候应当将k变0.这里如果用模运算就会超时。
代码如下:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
bool vis[100005];
int ans[100005];
int main()
{
// freopen("data.txt","r",stdin);
int n,k,p;
scanf("%d%d%d",&n,&k,&p);
int sum=0;
memset(vis,0,sizeof(vis));
int start=0;
while(sum<k/n)
{
for(int i=0;i<n;++i)
{
vis[start]=true;
if(i==n-1)
{
ans[sum++]=start;
}
if(sum<k/n)
for(int j=0;j<p+1;++j)
{
start++;
if(start==k)start=0;
while(vis[start]){
start++;
if(start==k)start=0;
}
}
}
}
sort(ans,ans+sum);
for(int i=0;i<sum;++i)
{
printf("%d\n",ans[i]+1);
}
return 0;
}