UVa 12545 Bits Equalizer——贪心

xiaoxiao2021-02-28  69

先把能交换的交换了,尽量交换,然后进行数字的变换,变换过程中遇到1 到 0直接输出-1;

变换过程好说,交换过程要考虑的情况比较多

首先把具体的数字进行交换,二层循环

然后把带问号的数字进行交换,具体怎么交换看代码,又是二层循环

最后一层循环解决变换问题

最终复杂度为O(n^2)

#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; char a[200], b[200]; int n, ans; int main() { int T, flag = 0; scanf("%d", &T); getchar(); while (T--) { gets(a); gets(b); n = strlen(a); ans = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (j == i) continue; if (a[i] == b[j] && b[i] == a[j] && a[i] != b[i]) { swap(a[i], a[j]); ans++; } } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (j == i) continue; if (a[i] == '1' && b[i] == '0' && b[j] == '1' && a[j] != '1') { swap(a[i], a[j]); ans++; } else if (a[i] == '0' && b[i] == '1' && a[j] == '?' && b[j] == '0') { swap(a[i], a[j]); ans++; } } } bool ok = true; for (int i = 0; i < n; i++) { if (a[i] == '1' && b[i] == '0') { ok = false; break; } if (a[i] == '?') { a[i] = b[i]; ans++; } else if (a[i] == '0' && b[i] == '1') { a[i] = b[i]; ans++; } } if (!ok) ans = -1; printf("Case %d: %d\n", ++flag, ans); } return 0; }

转载请注明原文地址: https://www.6miu.com/read-83623.html

最新回复(0)