题意:给出两个等长的字符串,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. python 1 面向对象基础知识

    1.编码范式 编程  是程序员用特定的 语法+数据结构+算法 组成的代码来告诉计算机如何执行任务的过程 如果把编程比作习武,编程方式就是武林中的各种流派,而在编程的世界里面最常见的两大流派是:面向过程 ...

  2. 【转】Phong和Blinn-Phong光照模型

    来自:http://www.cnblogs.com/bluebean/p/5299358.html Phong和Blinn-Phong是计算镜面反射光的两种光照模型,两者仅仅有很小的不同之处. 1.P ...

  3. one by one 项目 part 4

    出现异常”The last packet sent successfully to the server was 0 milliseconds ago.“的大部分原因是由于数据库回收了连接,而系统的缓 ...

  4. 在windows 2008 R2中SQl Server 2008中代理启动失败的一个原因总结

    启动SQL代理的时候报错如下: 关调用实时(JIT)调试而不是此对话框的详细信息,请参见此消息的结尾. ************** 异常文本 **************System.NullRef ...

  5. 一文看懂Stacking!(含Python代码)

    一文看懂Stacking!(含Python代码) https://mp.weixin.qq.com/s/faQNTGgBZdZyyZscdhjwUQ

  6. chnagyong sql

    select gid,count(distinct mid) from members group by gid mysql> SELECT IFNULL(NULL,); mysql> 1 ...

  7. LinuxI/O 性能分析

    .I/O linux 命令: ostat 监视I/O子系统 iostat [参数][时间][次数] 通过iostat方便查看CPU.网卡.tty设备.磁盘.CD-ROM 等等设备的活动情况, 负载信息 ...

  8. MySQL8 重置改root密码及开放远程访问

    1. 修改配置文件 先修改配置文件:vim /etc/my.conf 在 [mysqld] 下加上下面这行 skip-grant-tables 重启 mysql 服务: service mysqld ...

  9. Interface, 接口的实现初解

    百度是这么说的: Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 两种含 ...

  10. centos 系统下查看时间时区以及修改

    1.系统时间查看及修改: Centos 6 查看系统时间:# date