• ZXA AND SET HDU


    题意

    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);
    	}
    }
    
  • 相关阅读:
    flask的简单使用
    Android Studio 使用Lambda表达式
    安卓SDK更新 国内镜像站点记录
    REACT-NATIVE入门(环境搭建及HELLOWORLD)
    深入理解Android 读感(一)
    JNI初入手
    (转)c++ 中的using namespace std是什么意思,什么时候用
    (转)const char to LPCTSTR不能转化问题
    Git常用操作之add操作
    Git日志操作
  • 原文地址:https://www.cnblogs.com/xuwanwei/p/12797524.html
Copyright © 2020-2023  润新知