【GOJ 2348】小W与制胡串谜题

传送门

题意

给一些字符串 \(s_1,s_2,\dots,s_n\),求打乱组合后的 \(a_1,a_2,\dots,a_n\) 使得 \(a_1+a_2+\dots+a_n\) 最小。

正解

就是一道水题,但我就是不会做……

这道题如果要求 \(a_1+a_2+\dots+a_n\) 最小,那么满足他的子集(?)最小,即 \(a_n+a_{n+1}+\dots+a_m(n\le m)\) 最小。

那么可以有:如果 \(a+b<b+a\),则 \(a\) 放在 \(b\) 前面,反之亦然。

然后就没有然后了。

实在是不大清楚怎么写,欢迎大家补充。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
string s[N];
bool cmp(string a,string b) {
	return (a+b)<(b+a);
}
int main() {
	int n;
	scanf("%d",&n);
	for(int i=1; i<=n; i++) {
		cin>>s[i];
	}
	sort(s+1,s+n+1,cmp);
	for(int i=1; i<=n; i++) {
		printf("%s",s[i].c_str());
	}
	return 0;
}
上一篇:poj 2947 Widget Factory (高斯消元解同余方程组+判断无解、多解)


下一篇:C++中map按value值进行排序