【題目描述】 輸入一個高精度的正整數n,去掉其中任意s個數字后剩下的數字按原左右次序組成一個新的正整數。編程對給定的n和s,尋找一種方案使得剩下的數字組成的新數最小。 輸出新的正整數。(n不超過240位) 輸入數據均不需判錯。 【輸入】 n s 【輸出】 最后剩下的最小數。 【輸入樣例】 175438 4 【輸出樣例】 13
要考慮怎么刪數是最小,這里的想法就是貪心;
從高位到低位看,如果高位大於低位,那么刪掉高位的數:175438,1<7,不管;7>5,刪掉7;15438,5>4,刪5;
高位數越大,這個數就越大,所以我們要從高位來看,高位和下一位比較;
如果是遞增的數,那么就刪最后一位;位數變少,數字也會比刪其他的要少;例如:123456;
#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; }