UVa 12545 比特变换器

https://vjudge.net/problem/UVA-12545

题意:输入两个等长的串S和T,其中S包含字符0,1,?,但T只包含0和1。

用尽量少的步数把S变成T。每步有3种操作:

①把S中的0变成1;②把S中的“?”变成0或者1;交换S中任意两个字符。

思路:题目不是很难。首先考虑交换,然后再看有多少不同的,就需要再加上多少次。

 1 #include<string>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5
 6 string s1, s2;
 7 int cnt;
 8
 9
10 void solve()
11 {
12     int l = s1.size();
13     cnt = 0;
14     int num1 = 0, num2 = 0;
15     for (int i = 0; i < l; i++)
16     {
17         if (s1[i] == ‘1‘)    num1++;
18         if (s2[i] == ‘1‘)    num2++;
19     }
20     if (num1>num2)
21     {
22         cnt = -1;
23         return;
24     }
25
26
27     for (int i = 0; i < l; i++)
28     {
29         if (s1[i] != s2[i] && s1[i] != ‘?‘)
30         {
31             for (int j = i + 1; j < l; j++)
32             {
33                 if (s1[j] == s2[i] && s2[j] == s1[i])
34                 {
35                     cnt++;
36                     char temp;
37                     temp = s1[i];
38                     s1[i] = s1[j];
39                     s1[j] = temp;
40                     break;
41                 }
42             }
43         }
44     }
45     for (int i = 0; i < l; i++)
46     {
47         if (s1[i] != s2[i])     cnt++;
48     }
49
50 }
51
52 int main()
53 {
54     //freopen("D:\\txt.txt", "r", stdin);
55     int t, kase = 0;
56     cin >> t;
57     while (t--)
58     {
59         cin >> s1 >> s2;
60         solve();
61         cout << "Case " << ++kase << ": " << cnt << endl;
62     }
63
64     return 0;
65 }
时间: 2024-10-26 07:55:22

UVa 12545 比特变换器的相关文章

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

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

uva12545 比特变换器(贪心)

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中不同的数字,计算出还要再

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;

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(因

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 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d

UVA 10341 Solve It

Problem F Solve It Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB Solve the equation: p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 <= x <= 1. Input Input consists of multiple test cases and te

UVA 11014 - Make a Crystal(容斥原理)

UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, y, z)三点都为k的倍数的点的个数(要扣掉一个原点O).那么全部点就是f(1),之后要去除掉共线的,就是扣掉f(2), f(3), f(5)..f(n).n为素数.由于这些素数中包括了合数的情况,而且这些点必定与f(1)除去这些点以外的点共线,所以扣掉.可是扣掉后会扣掉一些反复的.比方f(6)在f