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 ...
随机推荐
- python_如何定义带参数的装饰器?
案例: 实现一个装饰器,用它来检查被装饰函数的参数类型. 需求: 装饰器可以通过函数,指明函数参数类型,进行函数调用的时候,传入参数,检测到不匹配时,抛出异常 如何解决这个问题? 先要获取函数的签名, ...
- asp.net web api 向客户端返回错误信息
1使用Http状态码 ASP.NET Web Api框架提供了Http状态码的值,如下图所示. 虽然有这些预定义的状态码,但在实际项目中使用自定状态码结合预定义状态码更有优势. 通过在适当的位置抛出异 ...
- MySQL中时间函数NOW()和SYSDATE()的区别
mysql中日期函数还是比较常用的.主要有NOW()和SYSDATE()两种,虽然都表示当前时间,但使用上有一点点区别. NOW()取的是语句开始执行的时间,SYSDATE()取的是动态的实时时间. ...
- Android webView包装WebAPP
前言 Android webView 兼容体验真的差到了极点!! 前一阵子,老板要讲 WebAPP 放到 Android 和 iOS 里面,而我因为以前做过安卓,所以这方面就由我来打包, 原理是很简单 ...
- 字段的参数 -- Django从入门到精通系列教程
该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...
- LVS负载均衡介绍
LVS介绍 负载均衡器 • 链路负载均衡 (三层负载均衡) • 服务器负载均衡 (四层负载均衡) • 应用层负载均衡 (七层负载均衡) • 全局负载均衡 基本情况 • 实现服务器负载均衡 • 核心功能 ...
- pwd 的“P”选项
1.目录是链接目录时,pwd -P 显示出实际路径,而非使用连接(link)路径:pwd显示的是连接路径 例: [root@localhost soft]# cd /etc/init.d [root ...
- chrome disable-web-security 关闭安全策略 解决跨域
Chrome 跨域访问线上接口 时间:2016-04-21 作者:zhongxia 前后端分离之后,联调的时候就会出现问题,那就是Ajax跨域问题. 跨域问题的解决方案有很多种比如常规的 后端使用CR ...
- 洛谷 [P2661] 信息传递
求有向图的权值为一的最小环 并查集做法 维护一个dis[],表示i号元素到fa[i]的距离. 对于输入的每两个点u,v,询问这两个点的fa[]是否相同,如果相同就成环,维护最小值,mi=min(mi, ...
- BZOJ 1593: [Usaco2008 Feb]Hotel 旅馆 [线段树]
传送门 题意: 操作1:找长为$len$的空区间并填满,没有输出$0$ 操作2:将$[l,r]$之间的区间置空 我真是太弱了这种线段树还写了一个半小时,中间为了查错手动模拟了$30min$线段树操作, ...