这个题是要求求出所给你的一些数所能组成的最大的数。
我用的贪心的方法做的,首先对所有给出的数按照字典序进行排序,然后对每次进行分别讨论处理,其中有一种方式是枚举2个数所组成的数然后取大值。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=51;
string str[maxn],ita;
bool vis[maxn];
bool cmp(string a,string b)
{
return a>b;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(!n)
break;
for(int i=0;i<n;i++)
cin>>str[i];
sort(str,str+n,cmp);
memset(vis,0,sizeof(vis));
string ans,stra,strb;
for(int i=0;i<n;i++)
{
if(vis[i])
continue;
char st=str[i].at(0);
int pos=i;
string stra=str[i];
for(int j=i+1;j<n;j++)
{
if(vis[j])
continue;
if(str[j].at(0)==st)
{
if(str[j]>stra)
{
if(str[j].size()<=stra.size())
{
stra=str[j];
pos=j;
}
else
{
string ita=stra+str[j];
string itb=str[j]+stra;
if(itb>ita)
{
if(ita.substr(min(ita.size(),itb.size()))<ita.substr(min(ita.size(),itb.size())))
{
stra=str[j];
pos=j;
}
}
}
}
else
{
if(str[j].size()<=stra.size())
{
string ita=stra+str[j];
string itb=str[j]+stra;
if(itb>ita)
{
stra=str[j];
pos=j;
}
}
}
}
else
break;
}
vis[pos]=1;
ans+=stra;
i=-1;
}
cout<<ans<<endl;
}
return 0;
}