洛谷 P1012 拼数 [字符串]
题目描述
设有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
输出样例#1:
View Code
next_permutation
34331213
[分析]:
首先我们可以证明最大的答案字典序也一定最大。
并且大家一定都知道C++的string类,然而可能不知道的是,这个类还定义了'<'运算符和'+'运算符。
而<的定义为按字典序比较,+的定义为字符串直接连接。
恰好符合此题题意。
[代码]:
#include<iostream> #include<algorithm> using namespace std; const int maxn=25; int n; string in[maxn]; bool cmp(const string &a,const string &b) { return a+b > b+a; } int main() { ios::sync_with_stdio(0); cin>>n; for(int i=1;i<=n;i++) cin>>in[i]; sort(in+1,in+1+n,cmp); for(int i=1;i<=n;i++) cout<<in[i]; cout<<endl; return 0; }
#include <iostream> #include <algorithm> //所需函数 #include <cstring> #include <string> using namespace std; int n; string s[22]; string ans = "0"; int main() { cin >> n; for (int i = 1; i <= n; i++) cin >> s[i]; do { string t; for (int i = 1; i <= n; i++) t = t + s[i]; //生成每一个数字(字符串) if (t > ans) ans = t; //字符串可以直接比较 }while (next_permutation(s+1,s+n+1)); //全排列 cout << ans << endl; return 0; }