【ACM】刪數問題(待更)
阿新 • • 發佈:2018-11-06
【描述】鍵盤輸入一個正整數N,去掉其中任意S個數字後剩下的數字按原左右次序將組成一個新的正整數。程式設計對給定的N和S尋找一種方案使得剩下的數字組成的新數最小。(N不超過240位,N>S)
【輸入】兩行,第一行:正整數N;第二行:正整數S。
【輸出】n去掉的s個數字後組成的新的正整數m。
【樣例輸入】
123006
2
123006
3
【樣例輸出】
1006
6
【題解】
列舉數字a[ i ],再判斷數字a[ i ]是不是在a[i,i+s]中最小,如果不是就刪除,每刪除一個就使s減1,直到s等於0,或剩餘的數量小於總長度,那麼剩下的數字都要比前面的數字大,全部刪除。
#include<algorithm> #include<cstdio> #include <iostream> #include <cstring> using namespace std; char a[1000]; int vis[1000]; int s; int main () { int t,i,j,flag,flag1,len,h0; while(scanf("%s",a)!=EOF) { cin>>s; flag=0; memset(vis,-1,sizeof(vis)); len=strlen(a); //輸出為0的特殊情況 h0=0; for(i=0;i<len;i++) { if(a[i]=='0') { h0++; } } if(s>=len-h0) { cout<<"0\n"; continue; } //一般情況 for(i=0;i<len;i++) { t=0; for(j=1;j<=s;j++) { if(a[i]>a[i+j]) { vis[i]=0; s--; break; } } if(i+s+1>len) { len-=s; break; } if(!s) { break; } } flag1=0; for(i=0;i<len;i++) { if(!flag1 && a[i]=='0') { continue; } if(vis[i]) { flag1=1; cout<<a[i]; } } if(!flag1) { cout<<'0'; } cout<<endl; } return 0; }