题意:有一些珠子排成一圈,珠子有两种颜色:黑和白。每次操作可以调换中间隔着一个珠子的两珠子的位置,给出这个圈子的初始状态,问最终能否通过操作让圈子中所有同色的珠子排在一起,即黑白分开。
分析:分两种情况,珠子总数为偶数,那么奇数位置上的珠子无法移动到偶数位上,偶数位的也无法移动到奇数位上,但在奇数位内部和偶数位内部可以自由移动。任何一个连续区间内奇数位和偶数位的数量差都不超过1。因此想要黑色珠子全都连在一起,则要求奇数位上的黑色珠子数量和偶数位上的黑色珠子数量之差的绝对值要小于等于1。
对于第二种情况,珠子总数为奇数,这种情况一定可以达到目标,因为如果任意相邻两珠子可交换则一定可以达到目标。对于总数为奇数的情况,相当于将一种相邻两珠子可交换的排列方式更改了珠子的排列顺序,但交换方式不变。例如,7个珠子,1357246。把这个序列首尾相接则形成了一个相邻两两可交换的环,可以达到任何目标状态。
#include <iostream> #include <cmath> using namespace std; const int maxn = 31; int n; void init() { int i, a, b, temp; scanf("%d", &n); a = 0; b = 0; for (i = 0; i < n; i++) { scanf("%d", &temp); if (!temp) continue; if (i % 2 == 0) a++; else b++; } if (n % 2 == 1) { printf("YES "); return; } if (abs(a - b) <= 1) { printf("YES "); return; } printf("NO "); } int main() { int t; //freopen("t.txt", "r", stdin); scanf("%d", &t); while (t--) { init(); } return 0; }