题意:给出两个等长的字符串,0可以变成1,?可以变成0和1,可以任意交换s中任意两个字符的位置,问从s变成t至少需要多少次操作。

析:先说我的思路,我看到这应该是贪心,首先,如果先判断s能不能变成t,就计算t中的1和s中的1。

然后算出t比s多多少1,然后先考虑把?变成1是最优的,如果不够就只能把0变成1,切不可把?变成1,因为这样要两步,

不是最优,而把0变成1是一步。然后把剩下的?变成1(如果1还不够)或者是0(1够了)。最后是计算要交换的次数,

这个只要统计不同的位置有多少即可,别忘了1可能还不够,这个也要算上,怎么算呢,想一下,先把0变成1,再交换,

所以说是要先加上要变化的1,然后在不同位置中也加上,然后除以2.相加就是结果。

然而我觉得自己写的太烂了,上网百度,看到大神们写的就是简洁明了。。。。

是这么想的,首先交换是最优的,因为一次操作能满足两个,然后再去找1-0和?-1的进行交换,为什么呢?因为我们看s中的1是不是多了,

如果少,没关系,可以直接把?变成1,如果多了就无解了,所以要比较这个。最后再加上?-0即可,这个只要一步。

大神就是牛逼。

代码如下:

这是我的代码

#include <cstdio>
#include <cstring>
#include <iostream> using namespace std;
const int maxn = 100 + 10;
char s[maxn], t[maxn]; int main(){
// freopen("in.txt", "r", stdin);
int T; cin >> T;
for(int kase = 1; kase <= T; ++kase){
scanf("%s %s", s, t);
int n = strlen(s);
int cnts1 = 0, cntt0 = 0, cnts0 = 0;//cnts1是s串中1的个数,同理其他的
for(int i = 0; i < n; ++i){
if('0' == t[i]) ++cntt0;
if('0' == s[i]) ++cnts0;
else if('1' == s[i]) ++cnts1;
}
int cntt1 = n - cntt0;//1的个数
int cntss = n - cnts0 - cnts1;//?的个数
int det = cntt1 - cnts1;//s和t差多少1 printf("Case %d: ", kase);
if(det < 0){ printf("-1\n"); continue; }//1太多了,把问号全改了都不够 int cnt = 0;
for(int i = 0; i < n; ++i)
if(det && '?' == s[i] && t[i] == '1'){
++cnt; s[i] = '1'; --det;//把?变成1
} for(int i = 0; i < n; ++i)//把0变成1
if(det && '0' == s[i] && '1' == t[i]){
--det; s[i] = '1'; ++cnt;
} for(int i = 0; i < n; ++i){//把剩下的?变成0或1
if(det && '?' == s[i]){ ++cnt; s[i] = '1'; --det; }
if(!det && '?' == s[i]){ ++cnt; s[i] = '0'; }
} int x = 0;
for(int i = 0; i < n; ++i)//计算不同的数,
if(s[i] != t[i]) ++x; cnt += det;//计算要要交换的次数
cnt += (x + det)/ 2;
printf("%d\n", cnt);
}
return 0;
}

下面是我参考大神们的代码写的:

#include <cstdio>
#include <cstring>
#include <iostream> using namespace std;
const int maxn = 100 + 10;
char s[maxn], t[maxn]; int main(){
int T; cin >> T;
for(int kase = 1; kase <= T; ++kase){
scanf("%s %s", s, t);
int n = strlen(s);
int zero_one = 0, one_zero = 0, q_one = 0, q_zero = 0; for(int i = 0; i < n; ++i){
if(s[i] == '0' && t[i] == '1') ++zero_one;
else if(s[i] == '1' && t[i] == '0') ++one_zero;
else if(s[i] == '?' && t[i] == '0') ++q_zero;
else if(s[i] == '?' && t[i] == '1') ++q_one;
} int cnt = 0;
while(zero_one && one_zero){
--zero_one; --one_zero;
++cnt;
} while(q_one && one_zero){
--q_one; --one_zero;
cnt += 2;
} if(one_zero) cnt = -1;
else cnt += q_zero + zero_one + q_one; printf("Case %d: %d\n", kase, cnt);
}
return 0;
}

UVa 12545 Bits Equalizer (贪心)的更多相关文章

  1. UVa 12545 Bits Equalizer【贪心】

    题意:给出两个等长的字符串,0可以变成1,?可以变成0和1,可以任意交换s中任意两个字符的位置,问从s变成t至少需要多少次操作 先可以画个草图 发现需要考虑的就是 1---0 0---1 ?---0 ...

  2. UVA - 12545 Bits Equalizer (比特变换器)(贪心)

    题意:输入两个等长(长度不超过100)的串S和T,其中S包含字符0,1,?,但T只包含0和1,你的任务是用尽量少的步数把S变成T.有以下3种操作: 1.把S中的0变成1. 2.把S中的“?”变成0或1 ...

  3. UVA 12545 Bits Equalizer

    题意: 两个等长的字符串p和q,p有‘0’,‘1’,‘?’组成,q由‘0’,‘1’组成.有三种操作:1.将‘?’变成0:2.将‘?’变成‘1’:3.交换同一字符串任意两个位置上的字符.问有p变到q最少 ...

  4. uva12545 Bits Equalizer

    uva12545 Bits Equalizer You are given two non-empty strings S and T of equal lengths. S contains the ...

  5. uva 1615 高速公路(贪心,区间问题)

    uva 1615 高速公路(贪心,区间问题) 给定平面上n个点和一个值D,要求在x轴上选出尽量少的点,使得对于给定的每个点,都有一个选出的点离它的欧几里得距离不超过D.(n<=1e5) 对于每个 ...

  6. 【习题 8-3 UVA - 12545】Bits Equalizer

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果1的个数第一个串比第2个串多. 那么就无解. 否则. 找几个位置去凑1 优先找'?'然后才是0的位置 剩余的全都用swap操作就 ...

  7. Bits Equalizer UVA - 12545

    点击打开链接 #include<cstdio> #include<cstring> /* 别看错了:0能变1,1不能变0 能完成的条件是,s与t长度相等且s中0数量和?数量之和 ...

  8. UVA 11039-Building designing【贪心+绝对值排序】

    UVA11039-Building designing Time limit: 3.000 seconds An architect wants to design a very high build ...

  9. Codeforces Round #276 (Div. 1) A. Bits 二进制 贪心

    A. Bits Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/484/problem/A Des ...

随机推荐

  1. WDA-FPM-3-SEARCH(OIF)

    转载:https://www.cnblogs.com/sapSB/p/10097830.html   FPM三:简单的SEARCH(OIF) 这里是使用FPM Workbench自动生成的,没有去SE ...

  2. AJAX是什么?

    AJAX的全称是Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). ajax不是新的编程语言,而是一种使用现有标准的新方法.ajax是与服务器 ...

  3. MySQLReport

    简介: MySQLReport 一.安装 shell > yum -y install mysqlreport perl-DBD-MySQL 二.使用 shell > mysqlrepor ...

  4. Haskell语言学习笔记(67)Gtk2Hs

    Gtk2Hs $ brew cask install xquartz $ brew install glib cairo gtk gettext fontconfig freetype $ expor ...

  5. Haskell语言学习笔记(30)MonadCont, Cont, ContT

    MonadCont 类型类 class Monad m => MonadCont m where callCC :: ((a -> m b) -> m a) -> m a in ...

  6. 迷你MVVM框架 avalonjs 学习教程10、样式操作

    一般情况下我们通过设置类名就可以改变元素的样式,但涉及到动画部分,就一定需要设置内联样式了,因此有了ms-css.*ms-css*的用法为ms-css-样式名="样式值", 如ms ...

  7. Validate the date format

    Validate the date format function checkdate(input) { var validformat = /^\d{2}\/\d{2}\/\d{4}$/; //Ba ...

  8. update from

    update table1 set table1.column1 =(select table2.column1 from table2  where 关联条件) where exists(selec ...

  9. logging的使用

    [logging的使用] import logging # 创建一个logger logger = logging.getLogger('mylogger') logger.setLevel(logg ...

  10. NBU 还原LINUX ORACLE数据库(CRM)

    [root@oraclea ~]# su - oracle [oracle@oraclea ~]$ bplist -C oracle-db1 -s // -e // -k oracle_oracle- ...