题意
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
",ans);
}
}