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 ...
随机推荐
- 在客户端浏览器中点击下载生成excel
生成excel的样式,里面的数据已经写好,使用apache,poi来写的. 1.首先是controller /** *下载服务结构体Excel * *@return */ @RequestMappin ...
- 常用类一一MATH类一一两个静态常量PI 和E,一些数学函数。
package test; public class MathTest { public static void main(String[] args) { System.out.println(Ma ...
- JS中创建对象的方法及json
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 吴裕雄 实战python编程(1)
import sqlite3 conn = sqlite3.connect('E:\\test.sqlite') # 建立数据库联接cursor = conn.cursor() # 建立 cursor ...
- SPARK数据类型
转自: http://www.cnblogs.com/tuitui1989/p/5331113.html 一.本地向量 有如下几个类: Vector(基类),DenseVector,SparseVec ...
- DOM 练习
练习一: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- Conductor Task Workers
由远程worker执行的conductor任务通过HTTP端点进行通信以轮询任务并更新执行状态. conductor提供了轮询任务的框架,管理执行线程并将执行状态更新回服务器.该框架提供了Java和P ...
- LINUX 修复relocation error: /lib/tls/libc.so.6
错误信息: relocation error: /lib/tls/libc.so.6: symbol _dl_tls_get_addr_soft, version GLIBC_PRIVATE not ...
- Anaconda中python加入环境变量
1.我的电脑---高级系统设置 2.选中环境变量,保存. 3.在系统环境变量PATH中,加入Anaconda3及Script路径加入其中 4.测试python
- HttpClient 超时时间
setSoTimeout(MilSec):连接超时时间.如果在连接过程中有数据传输,超时时间重新计算. setConnectTimeout(MilSec):获取连接超时时间.如果该参数没有设置,那么默 ...