UVa 12545 Bits Equalizer (贪心)
题意:给出两个等长的字符串,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 (贪心)的更多相关文章
- UVa 12545 Bits Equalizer【贪心】
题意:给出两个等长的字符串,0可以变成1,?可以变成0和1,可以任意交换s中任意两个字符的位置,问从s变成t至少需要多少次操作 先可以画个草图 发现需要考虑的就是 1---0 0---1 ?---0 ...
- UVA - 12545 Bits Equalizer (比特变换器)(贪心)
题意:输入两个等长(长度不超过100)的串S和T,其中S包含字符0,1,?,但T只包含0和1,你的任务是用尽量少的步数把S变成T.有以下3种操作: 1.把S中的0变成1. 2.把S中的“?”变成0或1 ...
- UVA 12545 Bits Equalizer
题意: 两个等长的字符串p和q,p有‘0’,‘1’,‘?’组成,q由‘0’,‘1’组成.有三种操作:1.将‘?’变成0:2.将‘?’变成‘1’:3.交换同一字符串任意两个位置上的字符.问有p变到q最少 ...
- uva12545 Bits Equalizer
uva12545 Bits Equalizer You are given two non-empty strings S and T of equal lengths. S contains the ...
- uva 1615 高速公路(贪心,区间问题)
uva 1615 高速公路(贪心,区间问题) 给定平面上n个点和一个值D,要求在x轴上选出尽量少的点,使得对于给定的每个点,都有一个选出的点离它的欧几里得距离不超过D.(n<=1e5) 对于每个 ...
- 【习题 8-3 UVA - 12545】Bits Equalizer
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果1的个数第一个串比第2个串多. 那么就无解. 否则. 找几个位置去凑1 优先找'?'然后才是0的位置 剩余的全都用swap操作就 ...
- Bits Equalizer UVA - 12545
点击打开链接 #include<cstdio> #include<cstring> /* 别看错了:0能变1,1不能变0 能完成的条件是,s与t长度相等且s中0数量和?数量之和 ...
- UVA 11039-Building designing【贪心+绝对值排序】
UVA11039-Building designing Time limit: 3.000 seconds An architect wants to design a very high build ...
- 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 ...
随机推荐
- WDA-FPM-3-SEARCH(OIF)
转载:https://www.cnblogs.com/sapSB/p/10097830.html FPM三:简单的SEARCH(OIF) 这里是使用FPM Workbench自动生成的,没有去SE ...
- AJAX是什么?
AJAX的全称是Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). ajax不是新的编程语言,而是一种使用现有标准的新方法.ajax是与服务器 ...
- MySQLReport
简介: MySQLReport 一.安装 shell > yum -y install mysqlreport perl-DBD-MySQL 二.使用 shell > mysqlrepor ...
- Haskell语言学习笔记(67)Gtk2Hs
Gtk2Hs $ brew cask install xquartz $ brew install glib cairo gtk gettext fontconfig freetype $ expor ...
- Haskell语言学习笔记(30)MonadCont, Cont, ContT
MonadCont 类型类 class Monad m => MonadCont m where callCC :: ((a -> m b) -> m a) -> m a in ...
- 迷你MVVM框架 avalonjs 学习教程10、样式操作
一般情况下我们通过设置类名就可以改变元素的样式,但涉及到动画部分,就一定需要设置内联样式了,因此有了ms-css.*ms-css*的用法为ms-css-样式名="样式值", 如ms ...
- Validate the date format
Validate the date format function checkdate(input) { var validformat = /^\d{2}\/\d{2}\/\d{4}$/; //Ba ...
- update from
update table1 set table1.column1 =(select table2.column1 from table2 where 关联条件) where exists(selec ...
- logging的使用
[logging的使用] import logging # 创建一个logger logger = logging.getLogger('mylogger') logger.setLevel(logg ...
- NBU 还原LINUX ORACLE数据库(CRM)
[root@oraclea ~]# su - oracle [oracle@oraclea ~]$ bplist -C oracle-db1 -s // -e // -k oracle_oracle- ...