题意:
如果一个序列被称为好序列,那么它不能被划分成两个值相等的序列(划分时可以跳着取)
问我们最少需要删去多少个值,使得序列变好,输出删去的个数以及哪些值
解法:
若序列和为奇数,那么已经是好序列
若序列和为偶数,那么背包判断是否可以分成两个值相等的序列
如果不可以,那么说明它也是好序列
如果可以,判断两个子序列是否有奇数
如果有,删去这个奇数就能使它变好
如果没有,说明序列中都是偶数,那么全体除二,再找是否有奇数,找不到再除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 "); 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 %d ",i); return 0; } } return 0; }