UVa 12545 Bits Equalizer【贪心】

题意:给出两个等长的字符串,0可以变成1,?可以变成0和1,可以任意交换s中任意两个字符的位置,问从s变成t至少需要多少次操作

先可以画个草图

发现需要考虑的就是

1---0

0---1

?---0

?---1

下面三种都是只需要一次操作就可以完成的,

所以应该优先考虑1---0

如果存在0---1,就优先交换1---0和0---1,因为这样可以同时满足两组

如果不存在0---1,就交换1---0与?---1,这样每交换一次,需要两次操作,即先将问号变成0,再交换

如果最后都还剩下有1--0(因为下面的0是动不了的,无法再配对了),说明上面的1找不到与它配对的了,不存在

自己写的挫爆了(而且还是错的----)---网上看了好几篇题解的贪心也好繁琐

学习的这一篇 http://acm.lilingfei.com/uva-12545-bits-equalizer-%E4%B9%A0%E9%A2%988-3_98

好棒o(≧v≦)o~~

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include <cmath>
 5 #include<stack>
 6 #include<vector>
 7 #include<map>
 8 #include<set>
 9 #include<queue>
10 #include<algorithm>
11 using namespace std;
12
13 typedef long long LL;
14 const int INF = (1<<30)-1;
15 const int mod=1000000007;
16 const int maxn=1000005;
17
18 char s[maxn];
19 char t[maxn];
20
21 int main(){
22     int T;
23     scanf("%d",&T);
24     int kase=0;
25     while(T--){
26         cin>>s;
27         cin>>t;
28
29         int len=strlen(s);
30         int one_zero=0,zero_one=0,q_one=0,q_zero=0;
31
32         for(int i=0;i<len;i++){
33             if(s[i]==‘1‘&&t[i]==‘0‘) one_zero++;
34             if(s[i]==‘0‘&&t[i]==‘1‘) zero_one++;
35             if(s[i]==‘?‘&&t[i]==‘1‘) q_one++;
36             if(s[i]==‘?‘&&t[i]==‘0‘) q_zero++;
37         }
38
39         int ans=0;
40         while(one_zero&&zero_one){
41             ans++;
42             one_zero--;
43             zero_one--;
44         }
45         while(one_zero&&q_one){
46             ans+=2;
47             one_zero--;
48             q_one--;
49
50         }
51
52         if(one_zero) ans=-1;
53         else ans+=zero_one+q_one+q_zero;
54
55         printf("Case %d: %d\n",++kase,ans);
56     }
57     return 0;
58 }

时间: 2024-10-26 03:49:30

UVa 12545 Bits Equalizer【贪心】的相关文章

uva 12545 - Bits Equalizer(比特变化器)

好在原来做题的思路不知道何时就养成了这种思路,可能是见这种思路多了一点吧,就自然的想到了用这种方法. 没有什么原因,思路题么,有思路那还用多说些什么,而思路是怎么来的,就更没什么好说的了...多去体会大神的思路或许是我等菜鸟提高的一个途径吧 #include<cstdio> #include<cstring> #include<string> #include<iostream> using namespace std; string s1,s2; int

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可

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.交换S中任意两个字符. 分析: 1.为保证步数最少,先统计两串中1的个数和1的位置.如果cnta>cntb,则不能把S变成T,因为1不能变成0. 2.先将?变成0或1,变换原则是若cnta<cntb且b中对应位置为1,则变为1:否则,变为0. 3.再将0变成1,变换原则

UVA 12545 Bits Equalizer

#include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) using namespace std; typedef long long ll; const int maxn=1000100; const int INF=1<<29; char s[maxn],t[maxn]; int len; int c10,c01,c1,c0;

12545 - Bits Equalizer(贪心?)

这道题我是自己出的思路,一遍A的 ,0.000ms. 看网上的题解大多相仿,我就说说我的思路吧 . 假设字符串 a.b 我们只需要从前向后扫一遍就行了,遇到?跳过去,遇到a[i] = '0'&&a[i]!=b[i] ;那么就向后找一个a[j]=='1'&&a[i]!=b[j],也就是说先用交换这个技能比较省步骤 .如果没有可以交换的,再扫一遍找? 如果a[i]==? && b[i]==0  那么显然可以先将?变成1 再和a[i]交换  ,需要两步,如果仍然没

UVa12545 Bits Equalizer (贪心)

链接:http://bak2.vjudge.net/problem/UVA-12545 分析:贪心乱搞. 1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 const int maxn = 100 + 5; 6 7 char s[maxn], t[maxn]; 8 9 int main() { 10 int T; 11 scanf("%d", &T); 12 for (

UVA 10317 - Equating Equations 贪心 dfs

UVA 10317 - Equating Equations 贪心 dfs ACM 题目地址:UVA 10317 - Equating Equations 题意: 给一个等式,但是这个等式不一定是正确的,要你对等式中的数字重新排序,使得等式成立.等式只有+和-,数字个数小于16. 分析: 以a + b - c = d - e为例子. 1. 我们把等式右边的各项都换到左边,a + b - c - d + e = 0 2. 把+项和-项放一起,就变成(a + b + e) - (c + d) = 0

UVA 12130 - Summits(BFS+贪心)

UVA 12130 - Summits 题目链接 题意:给定一个h * w的图,每个位置有一个值,现在要求出这个图上的峰顶有多少个.峰顶是这样定义的,有一个d值,如果一个位置是峰顶,那么它不能走到不大于该峰顶高度 - d的位置,如果满足这个条件下,并且无法走到更高的山峰,那么它就是峰顶 思路:利用贪心的策略,把所有点丢到优先队列,每次取出最高的峰值开始找,进行广搜,搜的过程中记录下最大值的点的个数,如果这个是峰顶,就加上这个数.判断是不是峰顶的方法为,如果广搜过程中,不会找到一个点的能到的最高峰

uva 1534 - Taekwondo(dp+贪心)

题目连接:uva 1534 - Taekwondo 题目大意:有两组什么东西,题目背景有点忘记了,就是给出两组数,两组个数分别为n,m,要求找出min(n,m)对数,每个数最多最多选一次,使得这min(n,m)对数ai,bi,ai-bi的绝对值之和最小. 解题思路:贪心,将两组数分别排序,然后dp[i][j]表示i对,匹配到j时候的最优解. #include <cstdio> #include <cstring> #include <cmath> #include &l