题目描述
小明正在使用一堆共K张纸牌与N-1个朋友玩取牌游戏。其中,N<=K<=100000, 2<=N<=100, K是N的倍数。纸牌中包含M=K/N张“Good”牌和K-M张“Bad”牌。小明负责发牌,他当然想自己获得所有“Good”牌。
他的朋友怀疑他会欺骗,所以他们给出以下一些限制,以防止小明耍诈:
1)游戏开始时,将最上面的牌发给小明右手边的人。
2)每发完一张牌,他必须将接下来的P张牌(1<=P<=10)一张一张地依次移到最后,放在牌堆的底部。
3)以逆时针方向,连续给每位玩家发牌。
小明迫切想赢,请你帮助他算出所有“Good”牌放置的位置,以便他得到所有“Good”牌。牌从上往下依次标注为#1,#2,#3,…
输入
共一行,包含3个正整数N,K和P,中间用空格隔开
输出
M行,从顶部按升序依次输出“Good”牌的位置
样例输入
3 9 2
样例输出
3
7
8
提示
[提交][状态]
这道题的难度还是可观的,不过用循环队列一下就出来了
#include<iostream>
#include<algorithm>
using namespace std;
int a[1200000],b[1200000];
int main()
{
int n,k,p,f=0,tail,q=0;
cin>>n>>k>>p;
for(int i=1;i<=k;i++)
{
a[i]=i;
}
tail=k;
for(int i=1;i<=k/n;i++)
{
for(int j=1;j<=n;j++)
{
f++;
if(j==n)
{
b[++q]=a[f];
}
for(int t=1;t<=p;t++)
{
f++;
a[++tail]=a[f];
}
}
}
sort(b+1,b+q+1);
for(int i=1;i<=k/n;i++)
{
cout<<b[i]<<endl;
}
return 0;
}
使用循环队列解决取牌游戏策略
小明与N-1位朋友玩取牌游戏,共有K张牌,其中M张是Good牌。每发一张牌,需将P张牌移至底部。题目要求找出所有Good牌的位置。给定N, K, P,使用循环队列可以有效解决问题。"
109736900,8449320,在Win10上安装PyCUDA的详细步骤,"['Python', 'CUDA', 'GPU编程', 'Visual Studio', '软件安装']
&spm=1001.2101.3001.5002&articleId=103225141&d=1&t=3&u=fc1d443a28d1446088fb14c0e8835590)
1050

被折叠的 条评论
为什么被折叠?



