2022牛客蔚来杯第三场
给n个字符串,最后拼接成一个字典序最小的大串
-
题解
- 正解是Trie树,不会。
- 题目其实可以转换成,哪个串放在前面是最优的,即存在可以比较出来的最优贡献顺序
假设a串放在前面更优
则有a+b
a✖️26+b < b✖️26+a (字符哈希思路,[a]代表a串的长度)
化简得 a/(26-1) < b/(26-1)
即每个串都可以通过自身的价值来判断是否更优,所以可以以此为排序式子排出最优的顺序,最后直接输出即可
-
代码
#include
#include
#include
using namespace std;
const int N=2e6+10;
string s[N];
bool cmp(string &s1,string &s2) {
return s1+s2>n;
for(int i=0;i>s[i];
sort(s,s+n,cmp);
for(int i=0;i
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
-
题意
- 给定n个十字路口,以及每个路口逆时针四个方向对着的路口是哪个
- 在路口只有右转不需要等红灯,转向其他方向都需要等红灯
- 给定起始边和终点边,问最少经历多少个红灯
-
题解
-
抽象题目,可以发现是一个最短路问题
-
建图,把每条路(cross_a,cross_b)视作点,而把每个十字路口看作边,等红灯看做边权为1,不等红灯看做边权为0
-
如何确定边权是0还是1,即如何确定从某点(某条路)到下一个点(下一条路)是否为向右转。
以0,1,2,3作为四个方向(逆时针数值增大),当一条路(u,v)即u->v,想知道下一个点(下一条路)是不是右转,即到点(v,m)是否右转,我们只需要比对中心v指向u的方向和v指向m的方向,是不是可以逆时针可以u到达m。即v路口指向u的方向数值加一是不是v指向m方向。
-
正权最短路,直接dijkstra就行
-
代码
#include
#include
#include