Problem Description
鍵盤輸入一個高精度的正整數n(≤100位),去掉其中任意s個數字後剩下的數字按照原來的左右次序組成一個新的正整數。編程對給定的n與s,尋找一種方案,使得剩下的數字組成的新數最小。
Input
輸入有多組 每組包括原始數n,要去掉的數字數s;
Output
輸出去掉s個數後最小的數
Sample Input
178543 4
Sample Output
13
題解:
使用貪心,刪去遞增區間末位或遞減區間首位,取得局部最優解,同時注意處理0爲前置時的情況
例如1002 2 結果爲0 而不是00
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int main()
{
char a[110];
int s;
while(cin>>a>>s){
int len=strlen(a);
if(s>=len) {
cout<<"0"<<endl;
continue;
}
//n次循環,刪去遞增區間末位或遞減區間首位,實現區部貪心
while(s--){
int j=0;
while(j<len&&a[j]<=a[j+1]){
j++;
}
//進行前移
len--;
for(int i=j;i<len;i++){
a[i]=a[i+1];
}
}
//處理前置字符爲0
int i=0;
while(a[i]=='0'&&i<len){
i++;
}
if(i==len) cout<<"0"<<endl;
else {
for(int k=i;k<len;k++){
cout<<a[k];
}
cout<<endl;
}
}
return 0;
}