1. 程式人生 > >10、移除k位得到最小值

10、移除k位得到最小值

(個人水平有限,請見諒!)

描述:

有一行由 N 個數字組成的數字字串,字串所表示的數是一正整數。移除字串中的 K 個數字,使剩下的數字是所有可能中最小的。 假設: 字串的長度一定大於等於 K。 字串不會以 0 開頭。

輸入:

一行由 N 個數字組成的數字字串(0 < N < 20),和一個正整數 K(K < N),兩個資料由空格隔開,如:1432219 3。

輸出:

移除 K 位後可能的最小的數字字串。 如 1432219 移除 4, 3, 2 這 3 個數字後得到 1219,為所有可能中的最小值。

輸入樣例:

1432219 3
10200 1

輸出樣例:

1219
200

程式碼示例:

#include <iostream>
#include <bits/stdc++.h>
#include <string>
using namespace std;

int main()
{
    char line[1000001]; 
    // 迴圈讀入多行資料
    while (cin.getline(line, 1000000)) {
        string str = "";
        char cstr[20];
        int k = 0;
        sscanf(line, "%s %d", cstr, &k);
        str
= cstr; int pos = 0; int len = k; int min = INT_MAX; int min_pos = pos; while (true) { if (len >= str.length() - pos) { str.erase(pos, len); break; } min = INT_MAX; min_pos = pos; for
(int i = pos; i <= pos + len; i++) { if (str[i] - '0' < min) { min = str[i] - '0'; min_pos = i; } } len = len - (min_pos - pos); str.erase(pos, min_pos - pos); pos++; } int cut = 0; for (int i = 0; i < str.length(); i++) { if (str[i] != '0') { cut = i; break; } } str.erase(0, cut); cout << str << endl; } return 0; }