zoukankan      html  css  js  c++  java
  • 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
    ");
            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;
    }
  • 相关阅读:
    页面get请求 中文参数方法乱码问题
    java版ftp简易客户端(可以获取文件的名称及文件大小)
    文件下载
    kafka:一个分布式消息系统
    Executor的线程代码
    验证码的生成
    二维码的简单实现
    rsync实现大致流程描述
    C++中模板生成时机
    gcc虚函数表生成时机
  • 原文地址:https://www.cnblogs.com/PdrEam/p/14691356.html
Copyright © 2011-2022 走看看