我没有用二分法,直接构造最小数,既然题目保证答案一定存在那么与上界无关。

如给定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的更多相关文章

  1. w3svc服务启动 不了,错误 1068:依赖服务或组件无法启动

    win10系统,装了iis就是启动不了,报错误 1068:依赖服务或组件无法启动. 各种实验无法使用,最后如下方法解决 运行命令regedit,打开注册表编辑器,进入:HKEY_LOCAL_MACHI ...

  2. BZOJ 1068: [SCOI2007]压缩

    Sol 区间DP.这个区间DP需要三维, \(f[i][j][k]\) 表示\([i,j]\) 这个区间中是否存在 \(M\) . 转移有两种,一种是这个区间存在 \(M\) ,那么直接枚举 \(M\ ...

  3. POJ 1068

    http://poj.org/problem?id=1068 这道题是一道模拟的题目 题目大意呢,p代表前面的'('的个数,而w代表这个括号所包括的括号的个数: 给你p,要你求w: 解题思路: 首先, ...

  4. ACdream 1214---矩阵连乘

    ACdream 1214---矩阵连乘 Problem Description You might have noticed that there is the new fashion among r ...

  5. acdream.LCM Challenge(数学推导)

     LCM Challenge Time Limit:1000MS     Memory Limit:64000KB     64bit IO Format:%lld & %llu Submit ...

  6. acdream.Triangles(数学推导)

    Triangles Time Limit:1000MS     Memory Limit:64000KB     64bit IO Format:%lld & %llu Submit Stat ...

  7. acdream.A Very Easy Triangle Counting Game(数学推导)

    A - A Very Easy Triangle Counting Game Time Limit:1000MS     Memory Limit:64000KB     64bit IO Forma ...

  8. acdream.Bet(数学推导)

    Bet Time Limit:1000MS     Memory Limit:64000KB     64bit IO Format:%lld & %llu Submit Status Pra ...

  9. acdream.郭式树(数学推导)

    郭式树 Time Limit:2000MS     Memory Limit:128000KB     64bit IO Format:%lld & %llu Submit Status Pr ...

随机推荐

  1. Linxu指令--date,cal

    在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,熟练运用date命令来表示自己想要表示的时间,肯定可以给自己的工作带来诸多方便. 1.命令格式: date [参数 ...

  2. Linux指令--traceroute,netstat,ss

    通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径.当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一 ...

  3. Centos7.3下mysql5.7.18安装并修改初始密码的方法

    Centos7.3下mysql5.7.18安装并修改初始密码的方法 原文链接:http://www.jb51.net/article/116032.htm 作者:Javen205 字体:[增加 减小] ...

  4. 【转】shell脚本实现多台服务器自动巡检--可参考学习

    shell脚本实现多台服务器自动巡检   摘要:           运维服务一个项目二十多台(或者多台)服务器,每天要做服务器的性能巡检工作是查看服务器的CPU.内存.磁盘空间是否在正常值范围内.像 ...

  5. ansible基础及使用示例

    1 介绍 Ansible 是一个系统自动化工具,用来做系统配管理,批量对远程主机执行操作指令. 2 实验环境 ip 角色 192.168.40.71 ansible管控端 192.168.40.72 ...

  6. 整理一点与排列组合有关的问题[组合数 Stirling数 Catalan数]

    都是数学题 思维最重要,什么什么数都没用,DP直接乱搞(雾.. 参考LH课件,以及资料:http://daybreakcx.is-programmer.com/posts/17315.html 做到有 ...

  7. CF781D Axel and Marston in Bitland [倍增 矩阵乘法 bitset]

    Axel and Marston in Bitland 好开心第一次补$F$题虽然是$Div.2$ 题意: 一个有向图,每条边是$0$或$1$,要求按如下规则构造一个序列然后走: 第一个是$0$,每次 ...

  8. 关于.NET C#上传大文件的解决办法

    1.最近在解决问题的时候遇到如何将视频以及语音和图片上传到阿里云的服务器中.但是遇到一些大文件就导致无法进行上传. 2.在将图片进行上传到阿里云的时候先将文件转化为二进制文件,然后通过文件流 的形式进 ...

  9. 微信小程序项目踩过的几个坑

    一.前言 近期,开始了一段辛酸的还未开始就已经结束的"创业"(参见我的第二次创业,以梦为马,莫负韶华).大体上是开发了一款微信小程序,关于创业这件事情就不细说了,本文主要介绍一下开 ...

  10. 安装基于 Linux 发行版的重要事项(流程指引)

    安装基于 Linux 发行版的重要事项(Install important issues based on the Linux distribution. (Process guidance)) 1. ...