【題目描述】 輸入一個高精度的正整數n,去掉其中任意s個數字後剩下的數字按原左右次序組成一個新的正整數。編程對給定的n和s,尋找一種方案使得剩下的數字組成的新數最小。 輸出新的正整數。(n不超過240位) 輸入數據均不需判錯。 【輸入】 n s 【輸出】 最後剩下的最小數。 【輸入樣例】 175438 4 【輸出樣例】 13
要考慮怎麼刪數是最小,這裏的想法就是貪心;c++
從高位到低位看,若是高位大於低位,那麼刪掉高位的數:175438,1<7,無論;7>5,刪掉7;15438,5>4,刪5;編程
高位數越大,這個數就越大,因此咱們要從高位來看,高位和下一位比較;spa
若是是遞增的數,那麼就刪最後一位;位數變少,數字也會比刪其餘的要少;例如:123456;code
#include <bits/stdc++.h> using namespace std; int main() { string a; int n,i,j,k; cin>>a>>n; int len=a.size(); for(k=0;k<n;k++) //這個循環控制刪數的次數 { for(i=0;i<len-1;i++) //這個循環比較此位和下一位的大小 { if(a[i]>a[i+1]) //刪數 { for(j=i;j<len-1;j++) a[j]=a[j+1]; break; //刪完數後,應該跳出循環,進行下一次找數刪數(break不能跳出if);n次刪數; } } len--; //若是不知足條件 (都是遞增的數),那麼長度直接減1;適用於123456這種狀況;其實無論滿不知足比較的條件,長度都會減1 } i=0; while(i<=len-1&&a[i]=='0') i++;
if(i==len) cout<<"0"<<endl; else for(j=i;j<=len-1;j++) cout<<a[j]; return 0; }