首页 > 技术文章 > CF1549B Gregor and the Pawn Game 题解

jiangtaizhe001 2021-08-05 22:01 原文

可能更好的阅读体验

题目大意

一个 \(n\times n\) 的棋盘上有一些国际象棋的兵,一端是我方的,另一端是敌方的,用两个 01 串表示这个位置上是否有兵。假设敌方的棋子不懂,问我方棋子最多能到达对面一端的个数。其中国际象棋的兵可以直线前进或者吃掉斜前方的敌方棋子并且走上去,两个棋子不能在同一位置。

题目解析

首先考虑是否可以贪心。
答案是可以的。我们从左到右考虑每一个我方的棋子,我们发现,如果棋子能尽量往左放就对后面的棋子影响最小,所以贪心策略就是尽量把棋子相左放。

代码:

#include<cstdio>
#define maxn 200039
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
//#define debug
typedef int Type;
inline Type read(){
	Type sum=0;
	int flag=0;
	char c=getchar();
	while((c<'0'||c>'9')&&c!='-') c=getchar();
	if(c=='-') c=getchar(),flag=1;
	while('0'<=c&&c<='9'){
		sum=(sum<<1)+(sum<<3)+(c^48);
		c=getchar();
	}
	if(flag) return -sum;
	return sum;
}
int n,T,ans;
char a[maxn],b[maxn];
int main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
    T=read();
    while(T--){
    	n=read(); ans=0;
    	scanf("%s%s",a+1,b+1);
    	for(int i=1;i<=n;i++){
    		if(a[i-1]=='1'&&b[i]=='1'){
    			a[i-1]='2';
    			b[i]='0'; ans++;
			}
			if(a[i]=='0'&&b[i]=='1'){
				a[i]='2'; ans++;
				b[i]='0'; 
			}
			if(a[i+1]=='1'&&b[i]=='1'){
				a[i+1]='2';
    			b[i]='0'; ans++;
			}
		}
		printf("%d\n",ans);	
	}
	return 0;
}

推荐阅读