首页 > 其他分享 >CF1733D1 题解

CF1733D1 题解

时间:2023-12-19 13:12:15浏览次数:27  
标签:CF1733D1 cnt int 题解 交换 long 相邻 代价

原题传送门


题目大意

给定两个长度为 \(n\) 的二进制字符串 \(a\) 和 \(b\),你可以进行若干次操作,对于每次操作:

  • 选两个数 \(l\) 和 \(r\),且 \(l<r\),将 \(a_l\) 和 \(a_r\) 交换。
  • 如果选取的 \(l\) 和 \(r\) 相邻,代价为 \(x\),否则为 \(y\)。

保证 \(y≤x\),求出最小代价使得 \(a=b\),若不能使 \(a=b\),输出 -1

思路分析

贪心,很简单的一个分类讨论。

首先,根据 \(y≤x\),要使得代价最小,尽量不交换相邻的。

记 \(a\) 和 \(b\) 不相同字符个数为 \(cnt\),分为以下几种情况:

  • 当 \(cnt\) 是奇数,无论怎么交换,都不能使 \(a=b\),输出 -1

  • 否则,继续判断,特判若 \(cnt=0\),即一开始 \(a=b\),输出 0

  • 尽量让交换的两个数不相邻,所以若 \(cnt>2\),则选择都不相邻的两个进行交换,进行 \(\frac{cnt}{2}\) 次不相邻交换,代价即为 \(\frac{cnt \cdot y}{2}\)。

  • 还有一种,当 \(cnt=2\),就需要判断是否相邻了:不相邻则输出 \(y\);相邻,则考虑进行一次代价为 \(x\) 的交换,或两次代价为 \(y\) 的交换(另外找一个字符进行交换),求两种哪种最优,即 \(\min(x,2y)\)。

因为 \(y≤x≤10^9\),交换次数越多,可能会爆 int,要开 long long

最后记得加上换行。

代码:

/*Written by smx*/
#include<bits/stdc++.h>
using namespace std;
int num[3005];
int main() 
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	while(t--)
	{
		long long len,x,y,cnt=0;
		string a,b;
		cin>>len>>x>>y>>a>>b;
		for(int i=0;i<len;i++)
		{
			if(a[i]!=b[i])
			{
				num[++cnt]=i;
			}
		}
		if(cnt%2==1)
		{
			cout<<"-1\n";
		}
		else 
		{
			if(cnt==0)
			{
				cout<<"0\n";
			}
			else if(cnt==2)
			{
				if(num[1]+1!=num[2])
				{
					cout<<y<<"\n";
				}
				else
				{
					cout<<min(x,2*y)<<"\n";
				}
			}
			else
			{
				cout<<cnt/2*y<<"\n";
			}
		}
	}
	return 0;
}

标签:CF1733D1,cnt,int,题解,交换,long,相邻,代价
From: https://www.cnblogs.com/shimingxin1007/p/17913491.html

相关文章

  • CF1191B 题解
    原题传送门题目大意\(3\)块麻将,求需要换掉几张牌才能一次出完\(3\)块麻将。每块麻将,用一个长度为\(2\)的字符串给出,字符串由\((1,9)\)的一位数字和\(m\)、\(s\)或\(p\)组成。\(3\)块一模一样的麻将或第\(2\)位相同,前面是连号的\(3\)块麻将都可以一次性出完。......
  • CF175B 题解
    原题传送门题目大意如题目描述。思路分析\(1≤n≤1000\),很明显\(\mathcal{O(n^2)}\)不超时,使用结构体,暴力即可。利用双循环求出名字相同的结构体并判断最高分,再根据字典序排序,再双循环求出比自己优秀人数,输出即可。代码:/*Writtenbysmx*/#include<bits/stdc++.h>usin......
  • Atcoder ABC 333 题解(A - F)
    ABC不讲D待更E待更F设$f(i,j)$为有$i$个人时,第$j$个人活到最后的概率,显然:\[f(i,j)=\begin{cases}1,&i=1,j=1\\\frac{1}{2}f(i,i),&i\neq1,j=1\\\frac{1}{2}f(i,j-1)+\frac{1}{2}f(i-1,j-1),&i\neq1,2\lej......
  • Queries for the Array 题解
    前言这场CF是我赛后打的,vp赛时没做出来,后来发现是有个地方理解错了,有一些细节没有考虑到。现在换了一种思路来写,感觉更清晰了。做法首先需要动态维护三个变量,\(cnt\)和\(finishsort\)和\(unfinishsort\)。这三个变量分别表示当前数字的个数,已经排好序的最后一个位置,和没......
  • poker 题解
    原题链接:poker赛时只有\(40\)分,改完之后感觉是一道好题,于是就来写篇题解。题意有\(k\)张扑克牌,\(n\)种数字,每张牌都有两面,每一面分别写了一个数字,你可以选择打出这张牌的任意一面,但是不能两面同时打,也可以选择不打这张牌。有\(q\)个询问,每个询问给定\(l\)和\(r\),判断......
  • P3694 邦邦的大合唱站队 题解
    原题链接:P3694思路状态设计因为这道题\(m\)的范围非常小,所以可以用\(m\)来作为状态。设\(dp_{i}\)表示\(m\)支队伍的状态为\(i\)时最少让多少偶像出列。预处理在转移之前,我们先要预处理出序列的前缀和\(sum_{i,j}\)表示第\(i\)个数之前有多少个值为\(j\)......
  • [AGC054C] Roughly Sorted 题解
    题意定义一种操作为交换\(a_{i}\)和\(a_{i-1}\)。对于一个长度为\(n\)的排列,你需要操作若干次,使这个序列变合法,一个序列合法指:满足对于每一个\(1\lei\len\),都满足包含\(a_i\)的逆序对的个数不超过\(k\),并且要求最小化操作次数。现在给定一个操作后的序列,询问原序列可......
  • P2391 白雪皑皑 题解
    原题链接:P2391。并查集好题。首先我们知道,并查集在一个无向图中可以维护两点之间的连通性,判断条件为:\(find(u)==find(v)\)。而对于这道题来说,我们可以用并查集来维护一个序列区间的重叠性或者说区间的连通性。因为题目上说了后面的操作会覆盖前面的操作,所以我们可以考虑倒序进行......
  • [ABC239Ex] Dice Product 2 题解
    原题链接:ABC239Ex。题意不多赘述。看到求期望值,我们想到可以用期望DP。设\(dp_{i}\)表示最终结果大于等于\(i\)时的操作次数的期望值。那么我们可以得到一个基本的状态转移方程:\(dp_{i}=\frac{1}{n}\times\sum_{j=1}^{n}dp_{\left\lceil\frac{i}{j}\right\rceil}+......
  • Prefix Purchase 题解
    题意给定一个长度为\(n\)的序列\(ans\),初始值全部为\(0\)。你一共有\(k\)个硬币,你可以选择花\(a_{i}\)个硬币来使\(ans_{1}\)到\(ans_{i}\)中的所有数加一。求最终能得到的\(ans\)序列中字典序最大的一个。思路首先我们可以发现一个很显然的性质:如果满足\(a_{i}......