C. Given Length and Sum of Digits...

原题链接

一句话题意

分别找出长度为n,每位数字和恰好为m的最小数和最大数,如果找不到输出”-1 -1“

思维

怎么确保构造的数最小/大?
怎么确保数字和恰好为m?

实施

遍历每一位,贪心地选取最大/最小的数,直到接下来的数字不足以贪心

细节

1.没有前导零
2.数字和恰好为m
3.注意边界特判

code

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    cin>>n>>m;

    if(m==0)
    {
        if(n==1) puts("0 0");
        else puts("-1 -1");
        return 0;
    }
    int m1=m,m2=m;

    string s1,s2;
    int flag1=0,flag2=0;


    for(int j=1;j<=9;j++)
    {
        if(m1-j<=(n-1)*9)
        {
            flag1=1;
            s1+=(j+'0');
            m1-=j;
            break;
        }
    }
    for(int j=9;j>=1;j--)
    {
        if(m2-j>=0)
        {
            flag2=1;
            s2+=(j+'0');
            m2-=j;
            break;
        }
    }


    if(flag1&&flag2)
    {
        for(int i=2;i<=n;i++)
        {
            if(m1==(n-i+1)*9&&flag1)
            {
                flag1=0;
                for(int j=i;j<=n;j++) s1+='9';
            }

            if(m2==0&&flag2)
            {
                flag2=0;
                for(int j=i;j<=n;j++) s2+='0';
            }


            if(flag1)
            for(int j=0;j<=9;j++)
            {
                if(m1-j<=(n-i)*9)
                {
                    m1-=j;
                    s1+=(j+'0');
                    break;
                }
            }

            if(flag2)
            for(int j=9;j>=0;j--)
            {
                if(m2-j>=0)
                {
                    m2-=j;
                    s2+=(j+'0');
                    break;
                }
            }

        }

        cout<<s1<<" "<<s2;
    }
    else puts("-1 -1");
    return 0;
}

posted @   纯粹的  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示