uva12545 比特变换器(贪心)

输入两个等长的串S,T(长度小于100),其中S包含字符0,1,?,T中包含0和1。有三种操作:将S中的0变为1,?变为0或1,交换S中的任意两个字符。求将S变成T的最少步数。

首先考虑去掉问号。设S中1的个数为one1,T中1的个数为one2。在one1<one2的前提下,肯定是把问号填成与T中相同的数字更优。如果one1=one2,那么问号中只能填0。接着就是考虑将0变成1,相同的思路即可。最后等到one1=one2,统计S和T中不同的数字,计算出还要再走几步即可。

#include <cstdio>
#include <cstring>
using namespace std; const int maxl=105;
int T, l1, l2, one1, one2, step;
char s1[maxl], s2[maxl]; int main(){
scanf("%d", &T);
for (int it=1; it<=T; ++it){
scanf("%s%s", s1, s2);
one1=one2=step=0; int tmp=0;
l1=strlen(s1); l2=strlen(s2);
for (int i=0; i<l1; ++i)
if (s1[i]=='1') ++one1;
for (int i=0; i<l2; ++i)
if (s2[i]=='1') ++one2;
if (l1!=l2||one1>one2){
printf("Case %d: -1\n", it);
continue; }
for (int i=0; i<l1; ++i)
if (s1[i]=='?'){ //用贪心法去除所有问号
s1[i]=s2[i];
if (s1[i]=='1') ++one1;
if (one1>one2) --one1, s1[i]='0';\
++step;
}
for (int i=0; i<l1; ++i) //用贪心法化0为1
if (one1<one2&&s1[i]=='0'&&s2[i]=='1'){
++one1; s1[i]='1'; ++step;
}
for (int i=0; i<l1; ++i) //统计不同之处
if (s1[i]!=s2[i]) ++tmp;
step+=tmp/2; //这是由于只有0和1
printf("Case %d: %d\n", it, step);
}
return 0;
}

uva12545 比特变换器(贪心)的更多相关文章

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

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

  2. UVa 12545 比特变换器

    https://vjudge.net/problem/UVA-12545 题意:输入两个等长的串S和T,其中S包含字符0,1,?,但T只包含0和1. 用尽量少的步数把S变成T.每步有3种操作: ①把S ...

  3. 使用C#处理基于比特流的数据

    使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...

  4. BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][St ...

  5. HDOJ 1051. Wooden Sticks 贪心 结构体排序

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  6. HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. BZOJ 1691: [Usaco2007 Dec]挑剔的美食家 [treap 贪心]

    1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 786  Solved: 391[Submit][S ...

  8. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  9. 【BZOJ-4245】OR-XOR 按位贪心

    4245: [ONTAK2015]OR-XOR Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 486  Solved: 266[Submit][Sta ...

随机推荐

  1. 关于python包,模块,.pyc文件和文件导入理解

    参考文献 一.包 包是一个文件夹,用来存放模块和子包. 包里一般会有一个__init__.py的文件(也可以没有). 包里会有一个__pycache__文件夹,存放.py文件经解释器解释后的中间字节码 ...

  2. linux命令学习笔记(11):nl命令

    nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 等等的功能. .命令格式: nl [选项]... [文件]... .命令参数: -b :指定行号 ...

  3. 表达式(exp)

    题目大意 给定一个逻辑表达式,求每一个数满足$\in[1,n]$的使的表达式为真的方案数. 题解 题目限制较奇怪且数据范围较小,所以可以考虑直接暴力. 考虑枚举每一个变量一共出现了$k$种数值,再枚举 ...

  4. scrollspy.js--bug

    /** * 20140505 14.33 ycx * scrollspy.js中存在的bug!!!---为什么ui.tabs必须在scrollspy.js中的window.onload之前执行,也就是 ...

  5. bzoj 2632 [ neerc 2011 ] Gcd guessing game —— 贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2632 官方题解:http://neerc.ifmo.ru/archive/2011/neer ...

  6. ES6学习之装饰器

    定义:修饰器是一个对类进行处理的函数,用来修改类的行为 <注>:装饰器只能用来修改类及类的方法 类的装饰: 静态属性:只能通过类访问,修饰函数直接在类上操作 @testable class ...

  7. TS学习之类

    定义类 class Person { name: string; //属性 constructor(_name: string) { this.name = _name; } //构造函数 sayHe ...

  8. .net wcf调用java的需要认证的接口

    1.wcf直接添加java的webservice地址,这都是常规操作,没必要好说 2.修改config配置文件,添加headers消息头节点,这个需要注意 3.OK直接调用里面的方法即可,全部搞定 & ...

  9. ABP源码学习目录

    ABP源码理解笔记 之前看过abp源码,但是时间久了很多也不记得了,所以近期打算重新看一遍,顺便做下笔记. 目录如下: Abp 框架启动流程分析 模块系统 依赖注入 模块配置 系统设置 工作单元的实现 ...

  10. Neural Networks and Deep Learning 笔记

    1 Introduction to Deep Learning 介绍了神经网络的定义,有监督学习,分析了为什么深度学习会崛起 1.1 结构化数据/非结构化数据 结构化数据:有一个确切的数据库,有key ...