牛客-[NOIP1998]拼数——贪心或暴力的求排列
Posted C+++++++++++++++++++
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客-[NOIP1998]拼数——贪心或暴力的求排列相关的知识,希望对你有一定的参考价值。
题目
题目详解
两种角度取求解这道题:
- 暴力的角度。
从暴力的角度,那肯定直接就算求排列的问题,把所有的排列给枚举出来取最大的那个,根据此题的问题规模最大为20,故可以采取此方法。求排列可用next_permutation。 - 贪心的角度。
用简单的string数组把所有数组融汇在一起,那么我们如何保证排出来的数字是最大的呢?我们只需调用排序即可,需要自定义排序的规则,一旦两个字符串连在一起时比它们交换位置连在一起的时候要小,则两者字符串位置交换。
解题代码
方法一:next_permutation
#include<bits/stdc++.h>
using namespace std;
string s[25];
int main()
int n;
cin>>n;
string ret;
for(int i=0;i<n;i++)
cin>>s[i];
ret += s[i];
int p[n];//用于构建排列顺序的数组
for(int i=0;i<n;i++)p[i] = i;
while(next_permutation(p, p+n))
string cmp;
for(int i=0;i<n;i++)
cmp += s[p[i]];
ret = max(ret,cmp);
cout<<ret;
return 0;
方法二:sort
#include<iostream>
#include<algorithm>
using namespace std;
int main()
ios::sync_with_stdio(false);
int n;
string s[100];
cin >> n;
for(int i = 0; i < n; i++) cin >> s[i];
sort(s, s + n, [](auto&a,auto&b)return a+b>b+a;);
for(int i = 0; i < n; i++) cout << s[i];
return 0;
以上是关于牛客-[NOIP1998]拼数——贪心或暴力的求排列的主要内容,如果未能解决你的问题,请参考以下文章