牛客-[NOIP1998]拼数——贪心或暴力的求排列

Posted C+++++++++++++++++++

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客-[NOIP1998]拼数——贪心或暴力的求排列相关的知识,希望对你有一定的参考价值。

题目


题目链接

题目详解

两种角度取求解这道题:

  1. 暴力的角度。
    从暴力的角度,那肯定直接就算求排列的问题,把所有的排列给枚举出来取最大的那个,根据此题的问题规模最大为20,故可以采取此方法。求排列可用next_permutation。
  2. 贪心的角度。
    用简单的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]拼数——贪心或暴力的求排列的主要内容,如果未能解决你的问题,请参考以下文章

洛谷-拼数-NOIP1998提高组复赛

洛谷P1012 [NOIP1998 提高组] 拼数

洛谷P1012 [NOIP1998 提高组] 拼数

P1012 [NOIP1998 提高组] 拼数

洛谷P1012 [NOIP1998 提高组] 拼数 C语言/C++

牛客-[NOIP2018]货币系统——完全背包问题的贪心优化