[NOIP1998]拼数
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
设有n个正整数(n ≤ 20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213
又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613
输入描述:
第一行,一个正整数n。 第二行,n个正整数。
输出描述:
一个正整数,表示最大的整数
示例1
输入
3 13 312 343
输出
34331213
嗯。。。这是我写的第一道贪心算法题。贪心算法就是只考虑目前情况的最优解,而不考虑其他的。这里面有一个排序的问题。就是说按什么来排,先不考虑这个问题。假设所有的数字已经被排成了一列,现在只看两个相邻的数字,显然地其他数字不受影响,那么目前只要这两个数字组合起来最大就好了,放到整体上来说就是只要每两个数字的组合都是最大的,那么整个排列就会达到最大。好了,下面我们来写一下代码。。对了,这个写法里面用了一个string的写法,这个它里面两个数组元素相加不是按一般的相加。。比如说1+2它是等于12的。。
代码:
#include <cstdio>
#include <bits/stdc++.h>
using namespace std;
//今天·我有点弄不明白一个String类型相加是咋搞的
// 下面写一个来看一看
/*int main()
{
string num[5];
for(int i=0;i<5;i++)
{
cin>>num[i];
}
cout<<num[1]+num[2];
return 0;
}//这把懂了,就是按位数来就行*/
int main()
{
int n;
cin>>n;
string num[n];
for(int i=0;i<n;i++)
{
cin>>num[i];
}
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(num[i]+num[j]<num[j]+num[i])
swap(num[i],num[j]);
}//找出最合适的排列
}
for(int i=0;i<n;i++)
{
cout<<num[i];
}
return 0;
}