CF1567D. Expression Evaluation Error(思维 贪心)

linkkkkk
题意:
给出 s , n s,n s,n,要求将 s s s拆成 n n n个数,使得这些数的和是 s s s并且按照 11 11 11进制计算得到的和最大。

思路:
如果将 10 10 10拆成了 1 + 9 1+9 1+9,那么和就从 ( 10 ) 11 = 11 (10)_{11}=11 (10)11=11变成了 ( 9 + 1 ) 11 (9+1)_{11} (9+1)11,损失了 1 1 1.
所以尽量将同一位上的整数放在一起,比如 123 = 100 + 20 + 3 123=100+20+3 123=100+20+3
如果不得不拆的话,就尽量在较低的高位中拆分,将 100 100 100拆成 10 + 90 10+90 10+90比将 100 100 100拆成 99 + 1 99+1 99+1损失小。前者是 1 0 11 + 9 0 11 = 1 ∗ 11 + 9 ∗ 11 = 110 10_{11}+90_{11}=1*11+9*11=110 1011+9011=111+911=110,后者是 9 9 11 + 1 11 = 1 ∗ 1 + 9 ∗ 1 + 9 ∗ 11 = 109 99_{11}+1_{11}=1*1+9*1+9*11=109 9911+111=11+91+911=109
代码:

int main() {
    int _=read;
    while(_--){
        int s=read,n=read;
        vector<int>res;//记录答案
        int x=1e9;
        while(x>=1){//从高位往低位划分,尽量按照整数位划分,如果必须要拆分的话,拆分损失小的低位
            if(n==1){//只剩一个数,直接输出就好
                res.push_back(s);break;
            }
            if(s-x<n-1){//保证剩下的能够凑齐
                x/=10;
                continue;
            }
            res.push_back(x);
            s-=x;n--;
        }
        for(auto t:res) cout<<t<<" ";
        puts("");
    }
    
    
   
   
    return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆沙睡不醒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值