Bailian4137 最小新整數

4137:最小新整數
總時間限制: 1000ms 內存限制: 65536kB
描述
給定一個十進制正整數n(0 < n < 1000000000),每個數位上數字均不爲0。n的位數爲m。
現在從m位中刪除k位(0<k < m),求生成的新整數最小爲多少?
例如: n = 9128456, k = 2, 則生成的新整數最小爲12456

輸入
第一行t, 表示有t組數據;
接下來t行,每一行表示一組測試數據,每組測試數據包含兩個數字n, k。
輸出
t行,每行一個數字,表示從n中刪除k位後得到的最小整數。
樣例輸入
2
9128456 2
1444 3
樣例輸出
12456
1

問題鏈接Bailian4137 最小新整數
問題簡述:(略)
問題分析
    從高位開始,找相鄰2位滿足高位大於低位的,刪除高位,若不存在高位大於低位的情況則刪除末位。重複這個過程,直到刪除k位爲止。
    如果n位整數爲d1d2…dkdk+1…dn,若dk>dk+1那麼d1d2…dk…dn>d1d2…dk+1…dn,所以這時應該刪除高位dk。而且可以證明,應該優先刪除高位的這種情況,纔可以保證得到最小的數。
程序說明:(略)
參考鏈接:(略)
題記:(略)

AC的C++語言程序如下:

/* Bailian4137 最小新整數 */

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 10 + 1;
char s[N];

int main()
{
    int t, k;
    scanf("%d", &t);
    while(t--) {
        scanf("%s%d", s, &k);
        int len = strlen(s);
        while(k--) {
            for(int i = 0; i < len; i++)
                if(s[i] > s[i + 1]) {
                    for(int j = i; j < len; j++) s[j] = s[j + 1];
                    break;
                }
            len--;
        }
        printf("%s\n", s);
    }

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