1 条题解

  • 0
    @ 2025-8-24 21:36:39

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 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
    上传者