將一組糖果分成兩堆,使兩堆糖果數量的異或值相等。若可能,輸出較大堆的糖果總數(最大化);否則輸出 NO。
設兩堆異或值分別為 X, Y,要求 X = Y ⇔ X ⊕ Y = 0。但 X ⊕ Y 正是所有糖果數量的總異或值 S。因此:
可行 ⇔ 所有數異或和為 0。
若總異或 S = 0,任意劃分滿足 X = Y。為使較大堆總和最大,應將最小的一顆糖果單獨分到小堆,其餘全在大堆。因為總和固定,小堆越小大堆越大。
答案 = 總和 - 最小值。
int main() {
int T; scanf("%d", &T);
for (int cas=1; cas<=T; ++cas) {
int n; scanf("%d", &n);
vector a(n);
int xorsum = 0, sum = 0, mn = INT_MAX;
for (int i=0;i
NYOJ 296 利用異或運算性質將問題化簡:總異或為 0 是可行充要條件,最優分配是「最小元素獨自成堆」。體現了位運算在組合博弈中的核心地位。