题解 | #数位染色#

数位染色

http://www.nowcoder.com/practice/adf828f399de4932955734a4eac12757

描述

给定一个不超过1e181e18的整数,选择1010进制下部分数位的数,使得选择数的和等于没选数的和

思路

  • 反正只有1818位,直接枚举选择哪些数位暴力就好了,最坏复杂度O(218)O(2^{18})貌似不用DPDP

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int nums[20];

int main()
{
    ll x;
    int len=0,sum=0;
    scanf("%lld",&x);
    for(int &i=len;x;x/=10,i++)
    {
        nums[i]=x%10;
        sum+=nums[i];
    }
    for(int i=0;i<(1<<len);i++)
    {
        int temp=0;
        for(int j=0;j<len;j++)
            if((i>>j)&1)
                temp+=nums[j];
        if(temp+temp==sum)
            return 0*puts("Yes");
    }
    puts("No");
    return 0;
}

空间复杂度O(log10n)O(log_{10}n),时间复杂度O(2log10n)O(2^{log_{10}n})

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务