Codeforces Round #277.5 (Div. 2) C. Given Length and Sum of Digits...(貪心)

1.題目鏈接:

https://codeforces.com/problemset/problem/489/C

2.題面:

在這裏插入圖片描述

3.翻譯:

您有一個正整數m和一個非負整數s。 您的任務是找到長度爲m且位數爲s的最小和最大數字。 所需數字應爲以十進制爲基數且不帶前導零的非負整數。

輸入值
輸入的單行包含一對整數m,s(1≤m≤100,0≤s≤900)—長度和所需數字的位數之和。

輸出量
在輸出中,輸出一對必需的非負整數-首先是最小可能的數字,然後是最大可能的數字。 如果不存在滿足所需條件的數字,則打印數字對“ -1 -1”(不帶引號)。

例子
inputCopy
2 15
outputCopy
69 96
inputCopy
3 0
outputCopy
-1 -1

4.思路:

這道題目我們首先要考慮的是輸出-1 -1的情況,我們可以知道,只要總和大於1就一定可以組成一個n位數的數字,但是當s小於1的時候,只有當n爲1的時候才一定可以組成,其他的都無法組成。所以第一種滿足的情況出來了:s<1並且n>=2,第二種就是s總數比每一位都取9的情況還要大,這樣子也肯定不滿足題意,所以最後輸出-1 -1的情況就是s<1並且n>=2或者s>9*n。這是第一個要解決的問題。後面取最大數和最小數,最大數很容易取,我們只有儘可能把高位往高了取,但是不能取大於9的數字就行了。而最小值我們就要考慮一種問題,不能直接把最大數逆序輸出就行,以爲假如最大數的最後一位爲0,你直接逆序的話那麼就不滿足位數,所以我們一定要使得最小值的首位不爲0,那麼我們就從高位開始掃,一旦出現一個大於0的數字就把這個數字減1加到第一位,這樣子在滿足位數的同時也保證了數的最小,這就是這道題目的貪心思想。

5.參考代碼:

#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e5 + 7;
int a[MAXN];
int b[MAXN];
int main()
{
    int n, s;
    cin >> n >> s;
    if ((s < 1 && n >= 2) || (s > 9 * n))
    {
        cout << "-1 -1";
    }
    else
    {
        for (int i = n; i >= 1; i--)
        {
            a[i] = min(s, 9);//每次取最大的值,但是不能大於9
            s = s - a[i];//取了之後總數減去
        }
        for (int i = 1; i <= n; i++)
        {
            b[i] = a[i];
        }
        if (b[1] == 0)//如果最小值的首位爲0的話,我們要使得不爲0
        {
            for (int i = 2; i <= n; i++)
            {
                if (b[i] != 0)//從大位開始判斷,一旦存在一個大於0的存在就減去一加到首位中,就實現了滿足位數,同時位數滿足的最小數
                {
                    b[i]--;
                    b[1]++;
                    break;
                }
            }
        }
        for (int i = 1; i <= n; i++)
        {
            cout << b[i];
        }
        cout << " ";
        for (int i = n; i >= 1; i--)
        {
            cout << a[i];
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章