C. Baby Ehab Partitions Again

题意:

如果一个序列被称为好序列,那么它不能被划分成两个值相等的序列(划分时可以跳着取)

问我们最少需要删去多少个值,使得序列变好,输出删去的个数以及哪些值

解法:

若序列和为奇数,那么已经是好序列

若序列和为偶数,那么背包判断是否可以分成两个值相等的序列

  如果不可以,那么说明它也是好序列

  如果可以,判断两个子序列是否有奇数

        如果有,删去这个奇数就能使它变好

        如果没有,说明序列中都是偶数,那么全体除二,再找是否有奇数,找不到再除2,直到找到。

        那么这段就是说,如果都是偶数,找最小的数即可,用二进制理解一下,可以用gcd加速这个过程

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const ll maxn = 2e6+10;
ll n,a[maxn],t,sum=0;
bitset<maxn>b;
int main(){
    ios::sync_with_stdio(false);
    cin>>n;b[0]=1;
    for(int i=1;i<=n;++i){
        cin>>a[i];
        sum+=a[i];
        b|=(b<<a[i]);
    }
    if((sum&1)||(!b[sum>>1])){
        printf("0\n");
        return 0;
    }
    ll g=0;
    for(int i=1;i<=n;++i){
        g=__gcd(g,a[i]);
    }
    for(int i=1;i<=n;++i){
        a[i]=a[i]/g;
    }
    for(int i=1;i<=n;++i){
        if(a[i]&1){
            printf("1\n%d\n",i);
            return 0;
        }
    }
    return 0;
}

 

posted @ 2021-04-22 20:23  PdrEam  阅读(104)  评论(0编辑  收藏  举报