算法初步—贪心—A1038

思路:
给出一堆数字字符串,问怎样组合可以得到最小值。仔细观察可以发现只要按字典序排序,好像可以大致满足要求,但是字典序排序是有缺陷的比如32和321字典排序的结果为32321,而实际上32132是最小的,因此我们得出了贪心策略。

策略:
将字符串a和字符串b相加,比较a+b和b+a,返回值更小的那一个

注意:
当字符串全为0时,输出0

#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(string a,string b) //返回数字串拼接更小的一个 
{
    return a + b < b + a;
}

int main()
{
    int N;
    string s[10005];
    cin>>N;
    for(int i=0;i<N;i++)
        cin>>s[i];
    sort(s,s+N,cmp);
    string ans;
    for(int i=0;i<N;i++)
        ans += s[i];
    while(ans.size() != 0 && ans[0] == '0') //去除前导0 
        ans.erase(ans.begin());
    if(ans.size() == 0)
        cout<<0<<endl;
    else
        cout<<ans<<endl;
    return 0; 
} 

猜你喜欢

转载自blog.csdn.net/daidaihema/article/details/79313921