ZXA AND SET HDU - 5680 组合数学
题意
zxa有一个集合\(A={a_1,a_2,?,a_n}\),n表示集合A的元素个数,这个集合明显有\((2^n?1)\)个非空子集合。
对于每个属于A的子集合\(B={b_1,b_2,?,b_m} (1≤m≤n)B={b_1,b_2,?,b_m}(1≤m≤n)\),m表示集合B的元素个数,zxa定义它的价值是\(min(b_1,b_2,?,b_m)\)。
zxa很好奇,如果令\(S_{odd}\)表示集合A的所有含奇数个元素的非空子集合的价值之和,\(S_{even}\)表示集合AA的所有含偶数个元素的非空子集合的价值之和,那么\(|S_{odd}?S_{even}|\)是多少,你能帮助他吗?
思路
- 貌似大家都可以观察出来,我并没有观察出来,看来以后要多观察观察,噫吁戱。
- 用组合数学推了一下,乱七八糟的
- 将A数组sort一下,非降序排序。
- X: 小于等于n的最大偶数,Y: 小于等于n的最大奇数
- \(S_{odd} = \sum_{i=1}^n{a_i * (C_{n-i}^{0} + C_{n-i}^2 +...+C_{n-i}^X)}\)
- \(S_{even} = \sum_{i=1}^n{a_i * (C_{n-i}^{1} + C_{n-i}^3 +...+C_{n-i}^Y)}\)
- 求\(|S_{odd}-S_{even}|\)的时候你就会发现很多居然可以抵消!
- \(|S_{odd}-S_{even}| = |\sum_{i=1}^n[{a_i}*(C_k^0 - C_k^1 + ... +(-1)^i*C_k^i+...+(-1)^k*C_k^k)]|\)
- 我才发现,居然组合数,\(C_k^0 - C_k^1 + ... +(-1)^i*C_k^i+...+(-1)^k*C_k^k\)一正一负这样相加,只有在k=0的时候,为1,其他都是为0的!
- 在这个题目中,\(n-i==0\) 的时候\(a_i\)才能保留住,其他\(a_i\)都为0了,即\(i==n\)的才能保留下来,所以最后的答案为\(a_n\), 即A数组里面最大那个数。
代码
#include<bits/stdc++.h> using namespace std; int main(){ int T,n; scanf("%d",&T); while(T--){ int ans=0; scanf("%d",&n); int x; for(int i=1;i<=n;i++){ scanf("%d",&x); ans=ans<x?x:ans; } printf("%d\n",ans); } }