Topcoder SRM 600 Div1 250 and Div2 600

Topcoder SRM 600 Div1 250 and Div2 600
Problem
  给一个长度为n的数列A和目标goal,甲从A中取若干个元素Ai,A(i+1),......,Ak,若它们的异或和Ai^A(i+1)^......^Ak等于goal,则甲赢。现在乙从A中删除若干个元素,问最少删除多少个元素可使得甲一定赢不了。

Limits
Time Limit(ms): 2000
Memory Limit(MB): 256
n: [1,50](Div1 250)或 [1,20](Div2 600)
A[i]: [1,10^9]
goal: [1,10^9]
A[i] !=A[j] (i !=j)

Solution
  考虑数列A中的元素,若(A[i] | goal) !=goal,则甲一定不能选择A[i],意味着乙不需要删除A[i];反之,若(A[i] | goal) ==goal,则甲可以选择A[i],乙有可能需要删除A[i]。考虑goal的二进制形式(...0100101...),对于每一个“1”的位置p,在所有能被甲选择的元素中,统计有多少个(假设有num个)在位置p也为1。answer等于num的最小值min-num。

More
  (A[i] | goal) !=goal,且甲选择了A[i],那么甲所构成的异或和一定不等于goal。所以,甲可选择的数以及乙所需删除的数都有(A[i] | goal) ==goal的性质,对于(A[i] | goal) !=goal的A[i]不需要考虑。
  下面证明为什么answer等于min-num。
  假设在位置p上,有最小值min-num。如果answer不等于min-num,说明可以删除少于min-num个数使得A无法获胜。但由于有min-num个二进制数在p位置上为1,删除少于min-num个数后,在p位置上所有数的异或和仍为1;又由于其他位置上至少有min-num个二进制数为1,那么删除少于min-num个数后,在该位置上所有数的异或和也为1。所以,若min-num不为0,甲只需把所有可选择的数取异或和,一定可以得到goal。因此,删除少于min-num个数不能使得A无法获胜,answer等于min-num。证毕。
   当n为20时,可以用状态压缩解决此问题。核心思想仍为上述思想,但复杂度为指数级别。

Complexity
Time Complexity: O(30*n)
Memory Complexity: O(30)

Source
Tocoder SRM 600 Div1 250
Tocoder SRM 600 Div2 600

Code
Topcoder SRM 600 Div1 250 From My Github
Topcoder SRM 600 Div2 600 From My Github


你可能感兴趣的:(二进制,或运算)