1. 程式人生 > >洛谷P1106 刪數問題

洛谷P1106 刪數問題

鍵盤輸入 style string 給定 clu size sca std cnblogs

題目描述

鍵盤輸入一個高精度的正整數N,去掉其中任意k個數字後剩下的數字按原左右次序將組成一個新的正整數。編程對給定的N和k,尋找一種方案使得剩下的數字組成的新數最小。

輸出應包括所去掉的數字的位置和組成的新的整數。(N不超過250位) 輸入數據均不需判錯。

輸入輸出格式

輸入格式:

n (高精度的正整數)

k (需要刪除的數字個數)

輸出格式:

最後剩下的最小數。

輸入輸出樣例

輸入樣例#1:
175438 
4
輸出樣例#1:
13
分析:貪心思想,我們每次刪數肯定是要找前面的大數給刪掉,並且這一位還要比下一位大,這樣刪掉以後一定會變小,模擬k次過程就好了,不過有幾點要註意:1.可能會出現前導0. 2.如果刪掉只剩下一個數,並且這個數是0,就不能把它當做前導0.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>

using namespace std;

string s;
int k,cnt;
bool flag = false;

int main()
{
    cin >> s; 
    int sizee = s.size();
    scanf("%d",&k);
    
for (int i = 1; i <= k; i++) { for (int j = 0; j < sizee - 1; j++) { if (s[j] > s[j + 1]) { for (int k = j + 1; k < sizee; k++) s[k - 1] = s[k]; break; } } sizee--; }
for (int i = 0; i < sizee; i++) if (s[i] != 0 || (s[i] == 0 && flag) || sizee == 1) { cout << s[i]; if (s[i] != 0) flag = 1; } return 0; }

 

洛谷P1106 刪數問題