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

洛谷 P1106 刪數問題 題解

for algorithm cnblogs style 其中 鍵盤輸入 輸入 color 一個

此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。

題目鏈接:https://www.luogu.org/problem/show?pid=1106

題目描述

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

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

輸入輸出格式

輸入格式:

n (高精度的正整數)

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

輸出格式:

最後剩下的最小數。

輸入輸出樣例

輸入樣例#1:
175438 
4
輸出樣例#1:
13


分析:
雖然洛谷給的難度只有普及-,這題坑點還挺多的...
貪心思路並不難,每次比較這個數字的第i位和i+1位,如果第i+1位的數字比第i位要小,顯然可以把第i位刪去。
要註意的主要是兩點,1.不要輸出多余的前導0 2.如果所有非零數都被刪去,輸出0


AC代碼:
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 
 6 char a[255];
7 int num[255]; 8 bool flag = false; 9 int main() 10 { 11 scanf("%s",a+1); 12 int n = strlen(a+1),k; 13 int len = n; 14 scanf("%d",&k); 15 for(int i = 1;i <= n;++ i) 16 num[i] = a[i]-0; 17 for(int i = 1;i <= k;++ i) 18 { 19 for(int
j = 2;j <= len;++ j) 20 { 21 if(num[j] < num[j-1]) 22 { 23 num[j-1] = 0; 24 len --; 25 for(int r = j;r <= n;++ r) 26 num[r-1] = num[r]; 27 //把刪除的空缺補起來 28 break; 29 } 30 } 31 } 32 for(int i = 1;i <= n-k;++ i) 33 {//復雜而醜陋的判斷 34 if(num[i]) flag = true; 35 if(!flag && !num[i]) continue; 36 printf("%d",num[i]); 37 } 38 if(flag == false) 39 printf("0"); 40 return 0; 41 }

洛谷 P1106 刪數問題 題解