[Codeforces]852A - Digits

题目大意:给一个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\n",a[1]);
        for(i=bn;i>1;--i)printf("%d+",b[i]);printf("%d\n",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;
    }
}

 

转载于:https://www.cnblogs.com/ditoly/p/CF852A.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值