1 条题解

  • 0
    @ 2025-8-24 22:35:31

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar gzlinzy
    Vn

    搬运于2025-08-24 22:35:30,当前版本为作者最后更新于2022-02-11 10:54:08,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    考虑将棋盘黑白染色。

    0 0
    0 0
    0 0 0 0
    0 0 0 0
    0 0 0 0
    

    染成

    1 0
    0 1
    1 0 1 0
    0 1 0 1
    1 0 1 0
    

    其中 1 代表黑色,0 代表白色。

    此时白色格子相邻的格子一定是黑色,黑色格子相邻的格子一定是白色。因此将相邻的两个格子中的数同时加 1 或减 1,这两个格子必定一黑一白。那么每次操作后黑格子之和与白格子之和作差,差值不变。

    我们可以求出一开始黑格子之和与白格子之和的差,再求出操作后除未知格外黑格子之和与白格子之和的差,二者相减便是答案。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int n1,m1,n2,m2,k,x,inf=999999,suma,sumb,sum,flag;
    int main(){
    	cin>>n1>>m1>>n2>>m2>>k;
    	for(int i=1;i<=n1;i++){
    		for(int j=1;j<=m1;j++){
    			cin>>x;
    			if(x==inf){		//若是未知格 
    				x=0;		//不计录它的值 
    				if((i&1)==(j&1))flag=1;		//记录它的颜色 
    			}
    			if((i&1)==(j&1)){  //若是黑色格 
    				suma+=x;
    				sumb++;
    			}
    			else{		//若是白色格 
    				suma-=x;
    				sumb--;
    			}
    		}
    	}
    	for(int i=n1+1;i<=n1+n2;i++){
    		for(int j=1;j<=m2;j++){
    			cin>>x;
    			if(x==inf){		//同上 
    				x=0;
    				if((i&1)==(j&1))flag=1;
    			}
    			if((i&1)==(j&1)){
    				suma+=x;
    				sumb++;
    			}
    			else{
    				suma-=x;
    				sumb--;
    			}
    		}
    	}
    	sum=suma-sumb*k;	//sumb 表示黑色格子数与白色格子数之差,乘 k表示黑格子之和与白格子之和的差
    	if(flag)sum*=-1;	//根据未知格颜色确定答案 
    	cout<<sum;
    	return 0;
    }
    

    无注释:

    #include<bits/stdc++.h>
    using namespace std;
    int n1,m1,n2,m2,k,x,inf=999999,suma,sumb,sum,flag;
    int main(){
    	cin>>n1>>m1>>n2>>m2>>k;
    	for(int i=1;i<=n1;i++){
    		for(int j=1;j<=m1;j++){
    			cin>>x;
    			if(x==inf){ 
    				x=0; 
    				if((i&1)==(j&1))flag=1; 
    			}
    			if((i&1)==(j&1)){ 
    				suma+=x; 
    				sumb++;
    			}
    			else{ 
    				suma-=x;
    				sumb--;
    			}
    		}
    	}
    	for(int i=n1+1;i<=n1+n2;i++){
    		for(int j=1;j<=m2;j++){
    			cin>>x;
    			if(x==inf){ 
    				x=0;
    				if((i&1)==(j&1))flag=1;
    			}
    			if((i&1)==(j&1)){
    				suma+=x;
    				sumb++;
    			}
    			else{
    				suma-=x;
    				sumb--;
    			}
    		}
    	}
    	sum=suma-sumb*k; 
    	if(flag)sum*=-1; 
    	cout<<sum;
    	return 0;
    }
    
    • 1

    信息

    ID
    7301
    时间
    500ms
    内存
    32MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者