Codeforces - 489C - Given Length and Sum of Digits...

发布于 2024-10-03 19:07:54 字数 2934 浏览 5 评论 0

题目大意

给你两个数 ms ,要你用 m0~9 之间的数”组成“他们之和为 s ,这里的组成就是这些数的和为 s ,要你求这样的数的最小值和最大值。

解析

细节有一点多的贪心题,错了好几次。。。注意细节就好:

  • 贪心的思想: 最小的大概是 100009999 类似这种,最大的是类似 9999910000 这种。最大值容易考虑,最小值的要注意很多情况;
  • 注意输出 -1 -1 的情况即: (s == 0 && m > 1) || s > m * 9
  • 注意特殊情况例如 m = 3,s = 9 ,不能输出 099 ,而是 108 ,不能有前导 0 ,所以也要特殊考虑;
import java.io.BufferedInputStream;
import java.util.Scanner;

public class Main {

    public static void main(String[] args){
        Scanner cin = new Scanner(new BufferedInputStream(System.in));
        int m = cin.nextInt();
        int s = cin.nextInt();
        int nineNum = s/9; // the num of 9 should be output
        int remainder = s%9;
        int left = m - nineNum;
        if((s == 0 && m > 1) || s > m * 9)
            System.out.println("-1 -1");
        else { 
            StringBuilder minn = new StringBuilder();
            StringBuilder maxx = new StringBuilder();
            if(remainder == 0 && m > 1 && left != 0) { // all number is 9 and left != 0 --> but can't have leading 0
                if(left > 0) {
                    if (left == 1) {
                        minn.append(remainder);
                    } else {
                        minn.append(1);
                        for (int i = 0; i < left - 1; i++) //not left-2
                            minn.append(0);
                        minn.append(8); // 分担出一个
                    }
                }
                for (int i = 0; i < nineNum-1; i++) { // not nineNum
                    minn.append(9);
                }
            }else {
                if(left > 0) {
                    if (left == 1) {
                        minn.append(remainder);
                    } else {
                        minn.append(1);
                        for (int i = 0; i < left - 2; i++)
                            minn.append(0);
                        minn.append(remainder - 1);
                    }
                }
                for (int i = 0; i < nineNum; i++) {
                    minn.append(9); 
                }
            }
            System.out.print(minn + " " );

            // deal with max value --> easy
            for (int i = 0; i < nineNum; i++)
                maxx.append(9);
            if(left > 0) {
                maxx.append(remainder);
                for (int i = 0; i < left - 1; i++)
                    maxx.append(0);
            }
            System.out.println(maxx);
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

荒人说梦

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

我们的影子

文章 0 评论 0

素年丶

文章 0 评论 0

南笙

文章 0 评论 0

18215568913

文章 0 评论 0

qq_xk7Ean

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文