首页 > 其他分享 >洛谷 P1012 [NOIP1998 提高组] 拼数 题解

洛谷 P1012 [NOIP1998 提高组] 拼数 题解

时间:2024-05-09 20:46:41浏览次数:12  
标签:洛谷 string 拼数 int 题解 cin 序列 define 字典

题目简述

设有 $n$ 个正整数 $a_1 \dots a_n$,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。

题目分析

定义

  • 设 $X$ 为数字 $x$ 的字符串形式。
  • $A+B$ 表示字符串 $A$ 和字符串 $B$ 相连组成的字符串。

思路

既然要构造最优解,显然如果有不优的情况的话,就需要对序列进行调整,具体而言我们可以这样做:

如果有 $A_{i+1}+A_i>A_i+A_{i+1}$,其中 $1 \leq i \lt n$,那么就交换 $A_{i+1}$ 和 $A_i$,现在 $A$ 的字典序明显更大了。重复上述操作,直至没有满足上述条件的情况了。

证明

为什么上述做法是对的呢?我们可以考虑用反证法进行证明:

经过上述操作后,设最终序列为 $T_1 \dots T_n$,且序列 $T$ 满足 $T_{i}+T_{i+1} > T_{i+1}+T_i$,其中 $1 \leq i \lt n$。我们先假设命题不成立,则序列 $T$ 不是字典序最大的序列,而 $S$ 是字典序最大的序列,那么 $S$ 必然有与 $T$ 不同的地方,则必然有 $S_{i+1}+S_i>S_i+S_{i+1}$,此时如果交换 $S_i$ 和 $S_{i+1}$,则必然有更大的字典序,与假设矛盾,故命题成立。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define random(a,b) (rand()%(b-a+1)+a)
#define se second
#define fi first
#define pr pair<int,int>
#define pb push_back
#define ph push
#define ft front
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,a,b) for(int i=a;i>=b;i--)
int n;
string s[21];
bool cmp(string a,string b)
{
	return a+b>b+a;
}
int main()
{
	ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
	For(i,1,n)
	{
		cin>>s[i];
	} 
	sort(s+1,s+1+n,cmp);
	For(i,1,n)
	{
		cout<<s[i];
	}
	return 0;
}

标签:洛谷,string,拼数,int,题解,cin,序列,define,字典
From: https://www.cnblogs.com/zhuluoan/p/18183031

相关文章

  • #dp,Dilworth定理#洛谷 4934 礼物
    题目传送门分析首先,可以放在一起当且仅当\(\max\{a_i,a_j\}\&\min\{a_i,a_j\}\neq\min\{a_i,a_j\}\)根据Dilworth定理可知最小链划分中链的数目等于最长反链的长度所以设\(dp[i]\)表示以\(i\)为结尾的反链的最大长度,则\(dp[i]=\max_{j|i}\{dp[j]\}+[a_k==i]\)......
  • 洛谷题单指南-动态规划2-P4310 绝世好题
    原题链接:https://www.luogu.com.cn/problem/P4310题意解读:求最长的子序列长度,使得每相邻两个元素&操作不为0。解题思路:直观来看,可以通过类似最长上升子序列的算法,进行状态转移,但是复杂度为O(n^2),会超时状态表示:dp[i]表示前i个数能产生满足条件的子序列的最长长度状态转移:dp......
  • 一本通蓝皮题解
    最小生成树1486:【例题1】黑暗城堡求最短路径生成树的个数先求出根节点到各点的最短路径然后统计每个点的答案个数如果一个节点到1号节点的最短路=另一个和它有连边的节点到根节点的最短路+它们两个节点之间的直接距离这个点的个数++最后用乘法原理统计答案将每个点的......
  • LLaMA-Factory 训练 Llama3-Chinese-8B-Instruct 相关报错问题解决
    模型路径up主为llama中文社区模型地址https://www.modelscope.cn/models/FlagAlpha/Llama3-Chinese-8B-Instruct/summarysysinfov10032gnvcc--versioncuda11.8pythonimporttorchprint(torch.version)13.11pipinstallflash_attntimeout2下载whl报这个错......
  • text-generation-webui 推理模型Qwen1.5-7B-Chat相关报错问题解决
    推理代码text-generation-webui推理模型Qwen1.5-7B-Chatsysinfo nvcc--versioncuda11.8importtorch>>>print(torch.__version__)1路径错误2依赖没安装ImportError:Thismodelingfilerequiresthefollowingpackagesthatwerenotfoundinyourenvironme......
  • [国家集训队] happiness 题解
    发现可以做如下建图:对于前两组输入,从\(s\)向所有代表学生的点连一条边,容量为其学习文科的喜悦值;从所有代表学生的点向\(t\)连一条边,容量为其学习理科的最大值。对于后四组输入,建两个点\(x,y\),从\(s\)向\(x\),从\(y\)向\(t\)分别连容量为相邻两人同时学文/理时额......
  • [题解]CF1907G Lights
    CF1907GLights我们可以把灯抽象成节点,而开关抽象成无向边(重边算作\(1\)条)。显然每个连通块要么是一棵树,要么是一棵基环树。对于基环树,我们把它看做若干棵树处理,最后我们再考虑如何处理环。如下图,这是一棵树,黄色的点表示亮灯。我们选定任意一条边,可以改变子节点和父节点的状......
  • CodeForces 1967D Long Way to be Non-decreasing 题解
    题意简述yzh喜欢单调不降序列。她有一个序列\(a\),最初为\(a_1,\ldots,a_n\),其中每个元素都在\([1,m]\)内。她希望使序列变得单调不降,为此,她有一个序列$b_1\ldotsb_m$,每个元素也在\([1,m]\)内。她可以进行若干次操作,一次操作定义为:选择一个集合\(S\subseteq......
  • CF1967C题解
    CF1906D这里更容易进入且有翻译题意对于数组\(a\),有函数\(f(a)\),设数组\(s=f(a)\),则对于每一个\(s_i\),都有:\[s_i=\left(\sum^{i}_{j=(i\operatorname{\&}(i-1))+1}{a_j}\right)\]其中\(\&\)表示按位与运算。对于一个正整数\(k\),函数\(f^k(a)\)定义如......
  • P10429 [蓝桥杯 2024 省 B] 拔河 题解
    思路通过动态规划计算出所有连续子序列的力量值之和,并将其存储在一个数组中然后排序,遍历一遍数组,找到相邻两个力量值之和的差的绝对值的最小值,然后输出这个答案就行了。时间复杂度大概是\(O(n^2\logn)\)。来个python的代码defmin_power_diff(n,a):#计算所有连续子序列......