刪數問題(典型的貪心演算法問題)
阿新 • • 發佈:2019-02-13
題目:
鍵盤輸入一個高精度的正整數n(<=240位),
去掉任意s個數字後剩下的數字按原左右次序將組成一個新的正整數。
程式設計對給定的n和s,尋找一種方案,使得剩下的數最小。
Simple Input
178543
4
Simple Output
鍵盤輸入一個高精度的正整數n(<=240位),
去掉任意s個數字後剩下的數字按原左右次序將組成一個新的正整數。
程式設計對給定的n和s,尋找一種方案,使得剩下的數最小。
Simple Input
178543
4
Simple Output
13
先放程式碼:
#include <cstdio> #include <cstring> using namespace std; int main() { int s,len; char n[260]; bool flag=false; gets(n); len=strlen(n); scanf("%d",&s); for(int i=1;i<=s;++i) { for(int j=0;j<len-1;j++) if(n[j]>n[j+1]) { for(int k=j;k<len-1;++k) n[k]=n[k+1]; break; } len--; } for(int i=0;i<=len-1;++i) { if(n[i]!='0') flag=true; if(flag) printf("%c",n[i]); } }
相信讀者會有以下疑問:
我們發現刪數時的規律為:若是升序,則刪除升序的最後一個,若是降序,則刪除第一個,那為什麼我寫了降序而不寫升序?
原因如下:
1、若是升序,當n[j]<n[j+1]時你不能保證n[j+1]是這個升序列裡的最後一個,而降序卻能判斷
2、刪降序的貪心效果比升序好,因為越高位越小越好