zoukankan      html  css  js  c++  java
  • Codeforces 1037C Equalize

    原题
    题目大意:
    给你两个长度都为(n)的的(01)(a,b),现在你可以对(a)串进行如下两种操作:
    1.交换位置(i)和位置(j),代价为(|i-j|)
    2.反转位置(i) ((0->1, 1->0)), 代价为(1)
    问你将(a)变成(b)的最小代价是多少。
    乍一看,像是dp。但是,仔细想一想,会发现只有在(i)(j)的距离为(1),且(a[i] eq b[i] and a[j] eq b[i] and a[i] eq a[j])时,直接交换才是最优的,因为当距离大于(1)且在这种情况下时,反转的代价仅为(2),不会比交换要差。其他情况下,若(a[i]=b[j]),不用管,否则直接反转。
    我们只需要先扫一遍,把能直接交换的先换了,再扫一遍,加上还需要反转的数量就可以了。
    代码如下:

     #include <bits/stdc++.h>
    
    using namespace std;
    
    string a, b;
    int n, ans;
    
    int main() {
    	cin >> n;
    	cin >> a >> b;
    	for(int i = 0; i < n-1; i++)
    		if(a[i] != b[i] && a[i+1] != b[i+1] && a[i] != a[i+1]) ans++, swap(a[i], a[i+1]);
    	for(int i = 0; i < n; i++)
    		if(a[i] != b[i]) ans++;
    	cout << ans;
    	return 0;
    }
    
  • 相关阅读:
    多文件编程(day13)
    字符串函数(day11)
    字符编码
    逻辑公式相等的自动证明
    排列组合问题之圆形分布
    排列组合之线性排列
    分金条
    进制的意义和算法
    集合的异或运算(对称差)
    集合习题之列出有限集合所有子集
  • 原文地址:https://www.cnblogs.com/dummyummy/p/9588614.html
Copyright © 2011-2022 走看看