ABC225F String Cards
题意:
给出 个小写字母串 ,让你从中选出 个,然后把这个 个串重新排列后拼接得到一个字符串,要求是这个结果字符串的字典序最小。问这个结果串是多少。
。
分析:
这个题,是两个比较经典的贪心模型的结合,很有意思。
1. 给定 个串重新排列然后拼接,使得最后的字典序最小。
原题传送门 NOIP1998提高组 选数...
好的,我们还是正经分析一下。这种给一个排列让你重排的问题基本都是考虑邻项交换。交换的条件是很好想的,就是 ,但是我们得证明它是带传递性的。这里有一个很妙的想法:注意到长度相同的串比较字典序,等价于转换成 进制数后比较大小,越小的,字典序就越小(容易发现如果位数不同这个性质就不成立了,比如 cd
和 e
)。那么我们不如设 写成数是 ,那么等价于:
然后我们移项以后会发现其实比较的就是:
诶那这个式子的比较就肯定有传递性了。
2.给定 个串 ,让你从中选 个串,按出现顺序拼接,使得字典序最小。
我们这个第一想法那就是 :设 是前 个串,选了 个出来的最小字典序结果。但是这个其实是错误的。
一个误区是,因为考虑字典序从前往后,这里的 也是从前往后考虑的。但是我们来看转移:,这个其实有点问题,你看 中的第二项,它实质上是从后往前确定的:我确定末尾的结果,然后加上前面部分字典序最小的结果。
你可能还没有意识到问题,那就想想我们平时让字典序最小,是不是从第一位开始,让高位尽可能的小。换言之我们是先确定最开头的字符串,然后让后面部分字典序最小的。
所以应该倒着 ,设 是后 个串,选 个出来的最小字典序结果。
我们把 1,2 两个问题结合起来,就做完了:先用 1. 问题中的排序方法把 排序,然后执行 2. 问题中的 。
事实上这种手法叫做 exchange-argument,想继续了解的可以直接去 CF 搜索。大致思想是,我们按照一个顺序排序,然后进行 。
代码:
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define op(x) ((x&1)?x+1:x-1)
#define odd(x) (x&1)
#define even(x) (!odd(x))
#define lc(x) (x<<1)
#define rc(x) (lc(x)|1)
#define lowbit(x) (x&-x)
#define Max(a,b) (a>b?a:b)
#define Min(a,b) (a<b?a:b)
#define next Cry_For_theMoon
#define il inline
#define pb(x) push_back(x)
#define is(x) insert(x)
#define sit set<int>::iterator
#define mapit map<int,int>::iterator
#define pi pair<int,int>
#define ppi pair<int,pi>
#define pp pair<pi,pi>
#define fr first
#define se second
#define vit vector<int>::iterator
#define mp(x,y) make_pair(x,y)
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef double db;
using namespace std;
const int MAXN=60;
ll n,k;
string s[MAXN];
string f[MAXN][MAXN],inf;
bool cmp(const string& s1,const string& s2){
return s1+s2<s2+s1;
}
int main(){
cin>>n>>k;
rep(i,1,n)cin>>s[i];
inf+=('z'+1);
sort(s+1,s+1+n,cmp);
rep(i,1,k)f[n+1][i]=inf;
per(i,n,1)rep(j,0,k){
f[i][j]=f[i+1][j];
if(j)f[i][j]=min(f[i][j],s[i]+f[i+1][j-1]);
}
cout<<f[1][k]<<endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】