zoukankan      html  css  js  c++  java
  • [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;
        }
    }
  • 相关阅读:
    Python必须知道的异常处理
    类的内置方法(用实际代码来验证)
    类的三大特性(继承, 封装, 多态)
    面向对象编程代码详解(依赖关系,关联关系,组合关系)
    函数(匿名函数,嵌套函数,高阶函数,装饰器)
    常用模块
    对磁盘文件的操作(文件处理)
    字符编码
    常用数据类型
    编程介绍
  • 原文地址:https://www.cnblogs.com/ditoly/p/CF852A.html
Copyright © 2011-2022 走看看