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 ...
随机推荐
- Django之 Model Field Options
以下这些选项都是可选择的,非固定要求. 1)null,注意在CharField或者TextField里避免使用null,因为其存储的值是空字符串而不是NULL 2)blank该字段是否可以为空.如果为 ...
- 详述Oracle RAC的五大优势及其劣势
不同的集群产品都有自己的特点,RAC的特点包括如下几点: ·双机并行.RAC是一种并行模式,并不是传统的主备模式.也就是说,RAC集群的所有成员都可以同时接收客户端的请求. ·高可用性.RAC是Ora ...
- 在Linux下判断系统当前是否开启了超线程
#lscpu Thread(s) per core: 2Core(s) per socket: 6Socket(s): 2 -------------------------------------- ...
- Spring Boot 菜鸟入门(持续更新)
目录 问题一 Note 最近入了Java的坑,正在学习spring boot.记录一下遇到的问题吧. 问题一 请求参数的问题 /get/bob我想获取bob @RequestMapping(value ...
- spring中的BeanFactory和FactoryBean的区别与联系
首先,这俩都是个接口… 实现 BeanFactory 接口的类表明此类是一个工厂,作用就是配置.新建.管理 各种Bean. 而 实现 FactoryBean 的类表明此类也是一个Bean,类型为工厂B ...
- Consul Session
consul馆提供session机制,可用于构建分布式锁. session作为节点,健康检查和key/value数据之间的绑定层. 它们旨在提供粒度锁定,并受到“The Chubby Lock Ser ...
- js json转对象
使用eval() 读取 for (var i=0;i< response.length; i++) { //alert(response[i].username) html=html+" ...
- Genetics in geographically structured populations: defining, estimating and interpreting FST
摘要:Wright’s F‑statistics, and especially FST, provide important insights into the evolutionary proce ...
- java swing:文本框添加滚动条
有几点要注意: 1.默认的滚动条,仅在输入的文本超过文本框时才会显示..没有超过文本框是不会显示的: 2.设置矩形大小,是在滚动条上设置,而不是在文本框上设置: 示例代码如下: public clas ...
- hdoj1014 互质
Uniform Generator Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...