1 条题解

  • 0
    @ 2025-8-24 22:34:29

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar zct_sky
    sto @jxbe6666 orz || 再起不能

    搬运于2025-08-24 22:34:29,当前版本为作者最后更新于2021-12-02 00:27:45,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    思路:

    为了使 AA 队得分尽量多,又因为 AA 队和 BB 队各有 2n2n 人,都可以改变 nn 次。所以最好能让 AA 队全赢(这不是废话吗),那么最好将 AA 队前 nn 个人全部改成赢的,但是 AA 队后面 nn 个人不能改了,又因为 BB 队输了就等于 AA 队赢了,所以只需将 BB 队后面 nn 个人改成输的即可。

    代码:

    #include<bits/stdc++.h>
    #define ll long long
    #define un unsigned
    using namespace std;
    inline int read(){//快读 
    	int x=0,y=1;
    	char ch=getchar();
    	while(ch<'0'||ch>'9'){
    		if(ch=='-')y=-1;
    		ch=getchar();
    	}
    	while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    	return x*y;
    }
    inline void write(int x){//快输 
    	if(x<0) putchar('-'),x=-x;
    	if(x>9) write(x/10);
    	putchar(x%10+48);
    	return;
    }
    int a[1000010],b[1000010],n,m; 
    int main(){
    	n=read();
    	for(int i=0;i<n;i++){
    		m=read();//输入 
    		int M=m<<1;
    		for(int j=0;j<M;j++)a[j]=read();
    		for(int j=0;j<M;j++)b[j]=read();
    		
    		write(M),putchar('\n');//输出 
    		for(int j=0;j<M;j++){
    			if(j<m)//使A队前n个人赢
    			   if(b[j]==1) a[j]=3;
    			   else if(b[j]==2) a[j]=1;
    			   else a[j]=2;
    			write(a[j]),putchar(' ');//输出
    		}
    	    putchar('\n');
    		for(int j=0;j<M;j++){
    			if(j>=m)//使B队后n个人输
    			   if(a[j]==1) b[j]=2;
    			   else if(a[j]==2) b[j]=3;
    			   else b[j]=1;
    			write(b[j]),putchar(' ');//输出
    		}
    		putchar('\n');
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    7226
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者