CF1549B Gregor and the Pawn Game 题解

可能更好的阅读体验

题目大意

一个 n×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;
}
posted @   jiangtaizhe001  阅读(75)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示