首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

NYOJ 296 Candy Splitting:異或性質與貪心分配

     編輯:關於C++

問題描述

將一組糖果分成兩堆,使兩堆糖果數量的異或值相等。若可能,輸出較大堆的糖果總數(最大化);否則輸出 NO。

核心洞察:異或為 0 的充要條件

設兩堆異或值分別為 X, Y,要求 X = Y ⇔ X ⊕ Y = 0。但 X ⊕ Y 正是所有糖果數量的總異或值 S。因此:
可行 ⇔ 所有數異或和為 0。

最大化較大堆總和

若總異或 S = 0,任意劃分滿足 X = Y。為使較大堆總和最大,應將最小的一顆糖果單獨分到小堆,其餘全在大堆。因為總和固定,小堆越小大堆越大。
答案 = 總和 - 最小值。

算法流程

  1. 讀入 n 和數組。
  2. 計算總異或 S 和總和 sum,找最小值 min。
  3. 若 S != 0 輸出 "NO";否則輸出 sum - min。

代碼實現

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 是可行充要條件,最優分配是「最小元素獨自成堆」。體現了位運算在組合博弈中的核心地位。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved