D1. Zero-One (Easy Version) Codeforces Round #821 (Div. 2)

 题意:给你两个二进制字符型a,b和 x,y(x>=y),然后你可以选择两个下标l,r,使a_i=1-a_i,

b_i=1-b_i ,进行操作后会根据l,r的位置关系产生相应的费用:

如果l+1=r  ,那么消耗的费用为x,否则就会消耗y。问你怎么消耗最少的费用,使a变成b。

思路:首先记录有多少个a_i需要转换,对于转换的情况,如果 l,r 位置的字母有一个满足a_l=b_l || a_r=b_r,那么需要转换的次数是不变的,如果两个都满足就不需要换,两个都不满足就需要的数量-2,那么对于所有的转换次数,只有转换次数为偶数时才可以使a=b

然后因为x<=y,那么转换的时候只要一直不使l+1=r,就可以一直消耗最少的策略。那么可以推出,在总数量大于2的时候,可以一直进行总和为y的操作。

而如果总数量为2,就看是否是连续的,如果是连续的就取x和y*2的最小值(y*2代表每个字母分别和同一个字母进行操作),如果不是直接就是y,然后输出结果就好了

/**
*  ┏┓   ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃       ┃
* ┃   ━   ┃ ++ + + +
*  ████━████+
*  ◥██◤ ◥██◤ +
* ┃   ┻   ┃
* ┃       ┃ + +
* ┗━┓   ┏━┛
*   ┃   ┃ + + + +Code is far away from  
*   ┃   ┃ + bug with the animal protecting
*   ┃    ┗━━━┓ 神兽保佑,代码无bug 
*   ┃  	    ┣┓
*    ┃        ┏┛
*     ┗┓┓┏━┳┓┏┛ + + + +
*    ┃┫┫ ┃┫┫
*    ┗┻┛ ┗┻┛+ + + +
*/

#include<cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include<vector>
#include<queue>
#include<map>
#define sc_int(x) scanf("%d", &x)
#define sc_ll(x) scanf("%lld", &x)
#define pr_ll(x) printf("%lld", x)
#define pr_ll_n(x) printf("%lld\n", x)
#define pr_int_n(x) printf("%d\n", x)
#define ll long long 
using namespace std;

const int N=100000+100;
ll n ,m,h;
char a[N],b[N];

int main()
{
	int t;
	sc_int(t);
	while(t--)
	{
		cin>>n>>m>>h;
		cin>>a+1>>b+1;
		int sum=0;
		bool flag=0;
		for(int i =1;i<=n;i++)
		{
			if(a[i]!=b[i])sum++;
			if(a[i]!=b[i]&&a[i+1]!=b[i+1]&&i+1<=n)flag=1;
		}
		if(sum%2!=0){
			cout<<"-1\n";
			continue;
		}
		ll res=0;	
		if(sum!=2||!flag) cout<<sum/2*h<<endl;
		else cout<<min(m,h*2)<<endl;

	}
	
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值