洛谷 P1106 刪數問題 題解
阿新 • • 發佈:2017-08-18
for algorithm cnblogs style 其中 鍵盤輸入 輸入 color 一個
輸入樣例#1:
此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。
題目鏈接:https://www.luogu.org/problem/show?pid=1106
題目描述
鍵盤輸入一個高精度的正整數N,去掉其中任意k個數字後剩下的數字按原左右次序將組成一個新的正整數。編程對給定的N和k,尋找一種方案使得剩下的數字組成的新數最小。
輸出應包括所去掉的數字的位置和組成的新的正整數。(N不超過250位) 輸入數據均不需判錯。
輸入輸出格式
輸入格式:n (高精度的正整數)
k (需要刪除的數字個數)
輸出格式:最後剩下的最小數。
輸入輸出樣例
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(intj = 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 刪數問題 題解