• [Codeforces]852A


    题目大意:给一个10^200000以内的数字,支持一种操作:在数字之间加若干个加号,把原数字变为加法运算后的结果,要求在三次操作内把数字变成个位数,输出方案。

    做法:直观的想法是每两位之间都塞加号,事实证明这样并不一定最优,比如第一次操作后得到1399999,最后一次会得到13。我写了一个比较科学的玄学做法,因为如果这种贪心不够优,第一次得到的数各位和一定比较大,而得到的这个数再加上一些小数字各位和就容易变小,于是如果贪心不行,我就在第一次操作的时候随便把一些两位合并,然后再贪心,不知道能不能被hack,但应该挺科学的。

    代码:

    #include<cstdio>
    #define MN 200000
    char s[MN+5];
    int n,u[MN+5];
    bool solve()
    {
        int i,sm=0,ss=0,sss=0,x,y,a[10],an=0,b[10],bn=0;
        for(i=1;i<=n;++i)if(u[i])sm+=(s[i]-'0')*10+s[i+1]-'0',++i;else sm+=s[i]-'0';
        for(x=sm;sm;sm/=10)ss+=a[++an]=sm%10;
        for(y=ss;ss;ss/=10)sss+=b[++bn]=ss%10;
        if(sss<10)
        {
            for(i=1;i<=n;++i)
            {
                if(i>1)putchar('+');
                putchar(s[i]);
                if(u[i])putchar(s[++i]);
            }
            puts("");
            for(i=an;i>1;--i)printf("%d+",a[i]);printf("%d
    ",a[1]);
            for(i=bn;i>1;--i)printf("%d+",b[i]);printf("%d
    ",b[1]);
            return false;
        }
        return true;
    }
    int main()
    {
        scanf("%d%s",&n,s+1);
        for(int i=1;solve();)
        {
            for(;s[i]=='0';++i);
            u[i]=1;i+=2;
        }
    }
  • 相关阅读:
    POJ 1401 Factorial
    POJ 2407 Relatives(欧拉函数)
    POJ 1730 Perfect Pth Powers(唯一分解定理)
    POJ 2262 Goldbach's Conjecture(Eratosthenes筛法)
    POJ 2551 Ones
    POJ 1163 The Triangle
    POJ 3356 AGTC
    POJ 2192 Zipper
    POJ 1080 Human Gene Functions
    POJ 1159 Palindrome(最长公共子序列)
  • 原文地址:https://www.cnblogs.com/ditoly/p/CF852A.html
Copyright © 2020-2023  润新知