博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces_B.Maximum Sum of Digits
阅读量:7227 次
发布时间:2019-06-29

本文共 995 字,大约阅读时间需要 3 分钟。

 

 

题意:将n拆为a和b,让a+b=n且S(a)+S(b)最大,求最大的S(a)+S(b)。

思路:考虑任意一个数,例如156,将其分为 d1:(1,155)d2:(6,150),其实S(a)+S(b)都是12;但是当分为 d3:(7,149)d4:(9,147)时(此时,由d2变为d3,b的个位由0变为9,跨越0),S(a)+S(b)变为了21;将其分为 d5:(57,99)d6:(68,88)时,S(a)+S(b)变为30。S(a)+S(b)是如何变大的?考虑b任意一个数位,当其从0变为9,S(a)增大1,S(B)增大8;当是其它情况时(数位变化不跨越0),相当于S(a)+x, S(b)-x,S(a)+S(b)不变。总结起来,划分(a,b)时让尽量多的数位变化能够跨越0,等于让b的每一位尽量分最多出来。得到贪心策略,每一数位都分9出来。例如,对4394826划分为(999999,3394827)

 

#include
#include
#include
using namespace std;#define LL long longint digitsum(LL x){ int res=0; while(x>0) { res+=x%10; x/=10; } return res;}int main(){ LL n; while(scanf("%I64d",&n)!=EOF) { int cnt9=0; LL tmp9=0; while(tmp9<=n) { tmp9=tmp9*10+9; cnt9++; } tmp9/=10; cnt9--; int res=cnt9*9+digitsum(n-tmp9); printf("%d\n",res); } return 0;}

 

转载于:https://www.cnblogs.com/jasonlixuetao/p/9744406.html

你可能感兴趣的文章
opencv轮廓提取、轮廓识别相关要点
查看>>
BOOST.ASIO源码剖析(一)
查看>>
过滤squidlog中各个链接的大小
查看>>
我的友情链接
查看>>
使用AnyChat如何实现任意两用户之间的音视频交互
查看>>
【个人小结】项目公共js的配置,解决不同页面多个配置修改的问题
查看>>
XAMP安装Apacher无法启动
查看>>
mongodb user
查看>>
ip地址子网划分
查看>>
Linux下快速搭建ntp时间同步服务器
查看>>
TouchEvent的传递过程学习笔记
查看>>
Android笔记--TCP Scoket(字符串收发)
查看>>
我的友情链接
查看>>
Hunt framework 2.0.0 发布,简单且高性能的 Web 服务框架
查看>>
数据库原理及应用(SQL Server 2016数据处理)【上海精品视频课程】
查看>>
MaxCompute表设计最佳实践
查看>>
Percona-Server-5.5.15源码安装
查看>>
容器安全拾遗 - Rootless Container初探
查看>>
LVS/NAT + keepalived负载均衡实现
查看>>
我的友情链接
查看>>