ACM,再見!
阿新 • • 發佈:2019-01-01
給定n位正整數a,去掉其中任意k≤n 個數字後,剩下的數字按原次序排列組成一個新的正整數。對於給定的n位正整數a 和正整數k,設計一個演算法找出剩下數字組成的新數最小的刪數方案。
演算法的原理應該是說從最高位開始,一次向低位搜尋,一旦遇到前一位(高位)的數大於當前位,則刪去前一位,直到刪除k個數,如果到達末尾還沒有刪除k個,則說明現在這個數已經是從小到大排序了,則從最低位開始刪除要求的位數。
程式碼1:
#include <stdio.h> #include <algorithm> #include <cmath> #include <string> #include <string.h> #include <iostream> using namespace std; int main() { string a; int n; while(cin >> a >> n) { int m=a.size(); for(int j=0; j<n; j++) { int flag=0; for(int i=0; i<m; i++) if(a[i]>a[i+1]) { a.erase(a.begin()+i); flag=1; break; } if(!flag) a.erase(a.end()-j,a.end()); } cout << a<< endl; } return 0; }
程式碼2:
#include <stdio.h> #include <algorithm> #include <cmath> #include <string> #include <string.h> #include <iostream> using namespace std; int main() { char a[105]; int n; while(cin >> a >> n) { int m=strlen(a); while(n--) { int i=0; while(i<m-1&&a[i]<=a[i+1]) { i++; } if(i==m-1) { m--; while(n--) m--; break; } else { for(int j=i;j<m-1;j++) a[j]=a[j+1]; m--; } } for(int i=0;i<m;i++) printf("%c",a[i]); cout << endl; } return 0; }