1 条题解
-
0
自动搬运
来自洛谷,原作者为

DrunkXT
生活的最好方式,冷冷清清的风风火火。搬运于
2025-08-24 21:36:39,当前版本为作者最后更新于2018-07-07 23:15:19,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
不要被题目吓到了
只是很普通的模拟,题目怎么讲就怎么做
进一步解释都在注释上了
#include<cstdio> #include<algorithm> #include<string> #include<iostream> using namespace std; const int MAXN=100005; struct Node {//用string类型,避免了空格回车的麻烦(虽然速度会慢一些) string c;//ColorNumber string t;//Type }a[MAXN],b[MAXN],ans[10]; int main() { freopen("三国杀I(洗牌&发牌).in","r",stdin); freopen("三国杀I(洗牌&发牌).out","w",stdout); int n,k,m,p; scanf("%d%d%d%d",&n,&k,&m,&p); if(k<n*4)//牌不够 { printf("Error:cards not enough"); return 0; } k=k/2*2;//利用下取整解决:可以有奇数张牌,最后一张牌将被无耻的度娘吃掉 for(int i=1;i<=k;i++) { cin>>a[i].c; cin>>a[i].t; } while(m--) {//洗牌方式:k/2+1,1,k/2+2,2,k/2+3,3, ... ,k,k/2 int j=1; for(int i=1;i<=k-1;i+=2,j++) { b[i]=a[k/2+j]; b[i+1]=a[j]; }//重新存回a数组 for(int i=1;i<=k;i++) a[i]=b[i]; } int j=1; //发牌方式:从第1张牌开始,第i张牌给第(i-1)%n+1个人 for(int i=1;i<=k&&j<5;i++) if((i-1)%n+1==p) {//保存答案 ans[j]=a[i]; j++; } for(int i=1;i<=4;i++) cout<<ans[i].c<<' '<<ans[i].t<<endl; return 0; }PS:代码无论在时间还是在空间上都可以优化~~,我懒得写了~~
- 1
信息
- ID
- 1348
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者