1038 Recover the Smallest Number (30 分)
cmp比较将前面最小的字符串进行排序,排序后str[0]=a,即a+str[i]<str[i]+a,所以a在字符串s中一定放在最前面,不然对任意一个s中包含 str[i]+a的部分换成a+str[i]都会更小,确定a在最前面后,字符串s剩下部分同理,b应该排在剩下字符串中的最前面的位置,这样逐步确定最小的s,每一步都确定是最优(贪心)
贪心:贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。
贪心算法的基本思路:
1.建立数学模型来描述问题。
2.把求解的问题分成若干个子问题。
3.对每一子问题求解,得到子问题的局部最优解。
4.把子问题的解局部最优解合成原来解问题的一个解。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp0(string a,string b){
return a+b<b+a;
}
int main(){
int n;
cin>>n;
vector<string>str(n);
for(int i=0;i<n;i++){
cin>>str[i];
}
sort(str.begin(),str.end(),cmp0);
string s;
for(int i=0;i<n;i++){
s+=str[i];
}
while(s.length()!=0&&s[0]=='0'){
s.erase(s.begin());
}
if(s.length()==0)cout<<0;
cout<<s;
system("pasue");
return 0;
}