ACdream 1068
我没有用二分法,直接构造最小数,既然题目保证答案一定存在那么与上界无关。
如给定S=16,它能构成的最小数为79,尽量用9补位,最高位为S%9.如果构造的数大于下界A,那么直接输出,因为这是S能构成的最小数;小于下界就要分两种情况了,第一种情况就是A的各位的和P小于S,那么从最低位一直向高位不,最高补9,补不到9,就补能补的最大数;第二种情况就是P大于S,那么就从最高位枚举,看能否补成和A同样的数,如不能立即返回上一位,加1,如果小于9,那么高位确定,剩下的就利用“尽量用9补位,最高位为S%9”的方法构造。
这题还有个坑人的地方,题目并没有说是多数据输入,但是如果用单组数据数据,会WA
AC代码:
#include<cstdio> #include<cstring> const int maxn=23; char a[maxn],b[maxn]; int tmp[maxn],ans[maxn],c; int main(){ while(scanf("%s%s%d",a,b,&c)==3){ int lenth=strlen(a); long long x=0; for(int i=0;i<lenth;++i){ tmp[i+1]=a[i]-'0'; x=x*10+a[i]-'0'; } int num=c; tmp[0]=ans[0]=0; long long y=num%9; for(int i=0;i<num/9;++i) y=y*10+9; if(y>=x) printf("%lld",y); else if(y<x){ int p=0; lenth++; for(int i=1;i<lenth;++i) p+=tmp[i]; if(p<=num){ for(int i=0;i<lenth;++i) ans[i]=tmp[i]; num-=p; for(int i=lenth-1;i>=0&&num>0;--i){ if(ans[i]+num>=9){ num-=9-ans[i]; ans[i]=9; } else { ans[i]+=num; num=0; } } if(ans[0]) printf("%d",ans[0]); for(int i=1;i<lenth;++i) printf("%d",ans[i]); } else { int h=num,ind; for(int i=0;i<lenth;++i){ ans[i]=0; if(tmp[i]>ans[i]){ num-=tmp[i]-ans[i]; ans[i]=tmp[i]; } if(num<=0){ int k; for(k=i-1;k>=0;--k){ ans[k]++; if(ans[k]<10) break; } ind=k+1; break; } } for(int i=0;i<ind;++i) h-=ans[i]; for(int i=ind;i<lenth;++i) ans[i]=0; for(int i=lenth-1;i>lenth-1-h/9;--i) ans[i]=9; if(h%9) ans[lenth-1-h/9]=h%9; if(ans[0]) printf("%d",ans[0]); for(int i=1;i<lenth;++i) printf("%d",ans[i]); } } printf("\n"); } return 0; }
如有不当之处欢迎指出!
ACdream 1068的更多相关文章
- w3svc服务启动 不了,错误 1068:依赖服务或组件无法启动
win10系统,装了iis就是启动不了,报错误 1068:依赖服务或组件无法启动. 各种实验无法使用,最后如下方法解决 运行命令regedit,打开注册表编辑器,进入:HKEY_LOCAL_MACHI ...
- BZOJ 1068: [SCOI2007]压缩
Sol 区间DP.这个区间DP需要三维, \(f[i][j][k]\) 表示\([i,j]\) 这个区间中是否存在 \(M\) . 转移有两种,一种是这个区间存在 \(M\) ,那么直接枚举 \(M\ ...
- POJ 1068
http://poj.org/problem?id=1068 这道题是一道模拟的题目 题目大意呢,p代表前面的'('的个数,而w代表这个括号所包括的括号的个数: 给你p,要你求w: 解题思路: 首先, ...
- ACdream 1214---矩阵连乘
ACdream 1214---矩阵连乘 Problem Description You might have noticed that there is the new fashion among r ...
- acdream.LCM Challenge(数学推导)
LCM Challenge Time Limit:1000MS Memory Limit:64000KB 64bit IO Format:%lld & %llu Submit ...
- acdream.Triangles(数学推导)
Triangles Time Limit:1000MS Memory Limit:64000KB 64bit IO Format:%lld & %llu Submit Stat ...
- acdream.A Very Easy Triangle Counting Game(数学推导)
A - A Very Easy Triangle Counting Game Time Limit:1000MS Memory Limit:64000KB 64bit IO Forma ...
- acdream.Bet(数学推导)
Bet Time Limit:1000MS Memory Limit:64000KB 64bit IO Format:%lld & %llu Submit Status Pra ...
- acdream.郭式树(数学推导)
郭式树 Time Limit:2000MS Memory Limit:128000KB 64bit IO Format:%lld & %llu Submit Status Pr ...
随机推荐
- 如何去掉ul标签的多余空白或多余大距离?
在css中写入 ul{ margin:; padding:; list-style: none; } 让其内边距和外边距为0,列表样式为空
- Log4j源码解析--核心类解析
原文出处:http://www.blogjava.net/DLevin/archive/2012/06/28/381667.html.感谢上善若水的无私分享. 在简单的介绍了Log4J各个模块类的作用 ...
- 错误:java.lang.NoClassDefFoundError: com/project/common/exception/ServiceException 的解决
问题: 项目编译通过,启动报错误信息java.lang.NoClassDefFoundError: com/project/common/exception/ServiceException. 解决方 ...
- 在Intellij IDEA 中clean报错:-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match.
解决办法:添加VM属性 -Dmaven.multiModuleProjectDirectory=$M2_HOME
- msyql多软件连接
菜鸟一枚 使用mysql删除数据库时,习惯性使用navicat,由于使用的是sqlyog备份的,就用sqlyog恢复数据库,结果总是报错. 用同事电脑没有问题,后来发现是用了不同的软件,导致数据库数据 ...
- httpd添加新模块
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- 基于Controller接口的控制器及简单应用
DispatcherServlet在Spring当中充当一个前端控制器的角色,它的核心功能是分发请求.请求会被分发给对应处理的Java类,Spring MVC中称为Handle.在Spring 2.5 ...
- JAVA设计模式之---工厂模式
1.引言 工厂模式可以分为类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 这种模式从上 ...
- 我的前端故事----关于前端数据&逻辑的思考
最近重构了一个项目,一个基于redux模型的react-native项目,目标是在混乱的代码中梳理出一个清晰的结构来,为了实现这个目标,首先需要对项目的结构做分层处理,将各个逻辑分离出来,这里我是基于 ...
- Android端生成META-INF信息文件的Gradle插件 RapidMetaInfPlugin
来源博客:Wang Jie's Blog 本文链接:<http://blog.wangjiegulu.com/2018/02/05/Android端生成META-INF信息文件的Gradle插件 ...