貪欲トピック - 最小の削除A番号

最小の番号を検索します。

N整数高精度正(以下5000)を入力し、前記新たな正の整数を形成するために、元の左と右を注文するために、任意の残りのk桁の数字を除去した後。
与えられたNおよびKは、新しい番号の残りの桁となるよう溶液の最小値を見つけます。

入力フォーマット:

所与これ以上千5以上の正の整数nの最初の行。2行目は非負整数kの所定のビット数nを超えていません。

出力フォーマット:

最後に残った最低限の数。

サンプル入力:

175438 4

出力例:

13

アイデア:
整数のビットの固定数の前提の下で、そう可能な限り小さく高い数は、整数の値が小さいこと

例えば175438
削除1:削除7--15438(8--17543を削除しない)
2を削除します。削除7,5--1438
削除3:754--138削除(785--143を削除しません)

あなたが番号をインクリメントした場合、検索の順序に従って、低い高は、その後、最後の数字を削除
減少し、最初のを削除した場合、最初の文字間隔の減少(可能な限り高いなど)、
その後、戻って最初の文字列に、上記の規則によって次の番号を削除します。

コード:

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<vector>
#include<iomanip>
#include<vector>
#include<string>
#define M 5010
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
vector<int>v;
string s;
int main(){
    cin >> s;
    for(int i=0; s[i]; i++)
        v.push_back(s[i]-'0');
    v.push_back(-1);
    
    int k;
    cin >> k;
    while(k--){         //删除k个
        int t=0;
        while(v[t]<=v[t+1] && v[t]!=-1)
            t++;
        v.erase(v.begin()+t);
    }
    
    bool flag = 0;      //输出
    for(int i=0; v[i]!=-1; i++){
        if(v[i]!=0) flag = 1;
        if(flag) cout << v[i];
    }
    if(!flag) cout << 0;
    cout << endl;
    
    return 0;
}

公開された62元の記事 ウォンの賞賛0 ビュー1740

おすすめ

転載: blog.csdn.net/jhckii/article/details/104475423
おすすめ