zoukankan      html  css  js  c++  java
  • Codeforces Round #717 (Div. 2) C.Baby Ehab Partitions Again 思维

    Codeforces Round #717 (Div. 2) C.Baby Ehab Partitions Again 思维

    题意

    给定数组(a),问去掉最少的元素使得不可以对剩余元素划分得到两个和相等的子序列

    [2 leq n leq 100\ 1 leq a_i leq 2000 ]

    分析

    若原本的数组和是奇数,那么本来就不可能拆出和相等的子序列

    若是偶数,那么只要去找到一个奇数就行了,这样剩下的和就会变成奇数

    但是有可能出现全部都是偶数的情况,这个时候两边的和一定都是偶数,完全可以除以二,保持了等价

    因此不妨干脆对所有数先除以一个gcd,这样就保证一定会有奇数了

    于是对数组预处理后,用bitset跑一遍布尔背包,判断是0还是1,是1的话就找到数组中的那个奇数即可

    代码

    int main(){
    	int n = rd();
    	vector<int> v(n);
    	for(int i = 0;i < n;i++)
    		v[i] = rd();
    	int g = v[0];
    	for(auto it:v) 
    		g = gcd(g,it);
    	for(auto &it:v)
    		it /= g;
    	int tot = 0;
    	for(auto it:v)
    		tot += it;
    	bitset<200005> st;
    	st[0] = 1;
    	for(int i = 0;i < n;i++)
    		st |= (st << v[i]);
    	if((tot & 1) || (!st[tot / 2])) {
    		puts("0");
    		return 0;
    	}
    	int pos = 0;
    	while(v[pos] % 2 == 0) pos++;
    	printf("1
    %d",pos + 1);
    } 
    
  • 相关阅读:
    java学习大方向
    js总结001
    MySQL总结
    快捷键
    java基础总结001
    网络设备的发展与作用(冲突域与广播域)
    二进制&八进制&十六进制之间的快速转换------ 心算&笔算方法总结
    IP地址的定义和划分
    初学Linux基本的命令操作应当记牢
    JDK的下载与安装
  • 原文地址:https://www.cnblogs.com/hznumqf/p/14691055.html
Copyright © 2011-2022 走看看