洛谷P1106 刪數問題
阿新 • • 發佈:2017-09-13
鍵盤輸入 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 刪數問題