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

传送门

这题想了半天怎么判断和为偶数时是否是好数组…我只能说01背包是在是太秀了。

01背包:体积为v时所能取得的最大价值。

当和为奇数时sum/2不存在。 ans = 0;
当和为偶数时,通过01背包判断存在时, ans = 1;
1,数组中存在奇数,则删掉这个奇数即可。
2,不存在奇数,找到所有偶数的GCD,都除以一个GCD,此时必定存在一个奇数

#include<bits/stdc++.h>
using namespace std;
 
typedef long long LL;         
typedef pair<int, int> P;
 
const int maxn = 2e5 + 10;        
const int M_MAX = 50000 + 10;
const int mod = 1e9 + 7;
const LL INF = 0x3f3f3f3f;    
const double eps = 1e-6;     
const double pi = acos(-1);

int n;
int arr[200], dp[maxn];

int gcd(int x, int y) {
    if(x < y) swap(x, y);
    if(y == 0) return x;
    return gcd(y, x % y);
}

int check() {
    int sum = 0;
    for(int i = 1; i <= n; i++) sum += arr[i];
    if(sum % 2 == 1) return 1;
    for(int i = 1; i <= n; i++) {
        for(int j = sum / 2; j >= arr[i]; j--) {
            dp[j] = max(dp[j-arr[i]] + arr[i], dp[j]);
        }
    }
    return dp[sum/2] != sum/2;
}

void solve() {
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> arr[i];
    if(check()) cout << 0 << endl;
    else {
        for(int i = 1; i <= n; i++) {
            if(arr[i] % 2 == 1) {
                cout << 1 << endl << i << endl;
                return ;
            }
        }
        int g = gcd(arr[1], arr[2]);
        for(int i = 3; i <= n; i++) 
            g = gcd(g, arr[i]);
        for(int i = 1; i <= n; i++) {
            arr[i] /= g; 
            if(arr[i] % 2 == 1) {
                cout << 1 << endl << i << endl;
                return ;
            }
        }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    //freopen("D:\\in.txt", "r", stdin);
    solve();
    return 0;
}
上一篇:自定义俄罗斯方块


下一篇:Codeforces Round #717 (Div. 2)