关于acm:XCPC真题1Bits-Reverse-Empty-Squares-Wall-Painting
作者:Eriktse 简介:19岁,211计算机在读,现役ACM银牌选手力争以通俗易懂的形式解说算法!❤️欢送关注我,一起交换C++/Python算法。(优质好文继续更新中……) 浏览原文取得更好浏览体验:https://www.eriktse.com/algorithm/1147.htmlA. Bits Reverse题目链接:https://codeforces.com/gym/102823/problem/D 题意给定两个数字x和y,当初有一种操作:将y的二进制数的间断三位进行翻转。问起码操作多少次能够使得x = y,或输入-1示意无奈使得x = y。 剖析因为每次固定选间断三位进行翻转,咱们能够想一下间断三位翻转的一些性质。 首先两头这个数字必定是不变的,而后两边的数字swap一下。 也就是每次会抉择间隔为2的两个数字进行一次替换,那么如果某个1在奇数位上,替换后仍然在奇数位上,如果在偶数位上,替换后仍然在偶数位上。 如下图,红色区域的二进制数和蓝色区域的二进制数是互相独立的。 所以咱们能够进行奇偶分类的探讨,求出在奇数位上所需的操作次数,而后再求在偶数位上所需的操作次数即可。 咱们能够发现,如果要使得操作后x = y,那么对于奇数位(即上图中的蓝色区域),y最高位的1肯定对应x最高位的1,以此类推。而在奇数位上挪动一格须要的操作次数是1次。 具体看下图的对应关系: 代码#include <bits/stdc++.h>#define int long longusing namespace std;const int N = 105;int a[N], b[N], pa, pb;int kase;int getabs(int x){return x < 0 ? -x : x;}void solve(){ cout << "Case " << ++ kase << ": "; int x, y;cin >> x >> y; pa = pb = 0; int ans = 0; for(int i = 0;i < 64; i += 2) { if(x >> i & 1)a[++ pa] = i; if(y >> i & 1)b[++ pb] = i; } if(pa != pb) { cout << -1 << '\n'; return; } for(int i = 1;i <= pa; ++ i)ans += getabs(a[i] - b[i]) / 2; pa = pb = 0; for(int i = 1;i < 64; i += 2) { if(x >> i & 1)a[++ pa] = i; if(y >> i & 1)b[++ pb] = i; } if(pa != pb) { cout << -1 << '\n'; return; } for(int i = 1;i <= pa; ++ i)ans += getabs(a[i] - b[i]) / 2; cout << ans << '\n';}signed main(){ ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int _;cin >> _; while(_ --)solve(); return 0; }B. Empty Squares题目链接:https://codeforces.com/gym/104252/problem/E ...