CUGB2023校天梯赛总结

传送门
题解视频

M1 文件路径

题目描述

给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为更加简洁的规范路径。

在 Unix 风格的文件系统中,一个点(‘.’)表示当前目录本身;此外,两个点 (‘…’) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,‘//’)都被视为单个斜杠 ‘/’ 。 对于此问题,任何其他格式的点(例如,‘…’)均被视为文件/目录名称。

请注意,返回的 规范路径 必须遵循下述格式:

  • 始终以斜杠 ‘/’ 开头。
  • 两个目录名之间必须只有一个斜杠 ‘/’ 。
  • 最后一个目录名(如果存在)不能 以 ‘/’ 结尾。
  • 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 ‘.’ 或 ‘…’)。

返回简化后得到的 规范路径 。

输入格式

一行一个字符串,表示一个Unix风格的绝对路径

输出格式

一行一个字符串,表示简化后的规范路径

M2 小H的烦恼

题目描述

小H喜欢听歌,也会收藏很多专辑,但是他有一些有着各自名字的玩具小人平常喜欢欺负他,这一次又把他的专辑藏起来了。小H发现玩具小人都按逆时针围成一个圈,并且发现有的小人朝外有的小人朝内(1、4、5朝内,2、3朝外)

在这里插入图片描述

其中位置在1号的玩具小人labaer告诉小H指令:「专辑藏在我左数第 3 个玩具小人的右数第 1 个玩具小人的左数第 2 个玩具小人那里。」 小H对着他们仔细研究了起来:

  • labaer朝内,它的左数第3个是gulier
  • gulier朝外,它的右数第1个是thinker
  • thinker朝外,它的左数第2个是selfier 所以歌词就藏在selfier手上,成功拿到了专辑,又开始听起了歌。

这一次虽然成功了,但是以后可能会有更多,现在他想问问你是否能写出一个程序来帮帮他来应付以后的情况,现在告诉你一共有n个玩具小人,已知他们的名字和朝向,现在1号玩具小人开始告诉m条指令,也就是说出来左数还是右数第 x i x_i xi个玩具小人,请你帮帮小H解决出专辑最后藏在谁的手上。

输入格式

第一行输入两个正整数n,m,表示玩具小人的个数以及指令的条数,1≤n,m≤ 1 0 6 10^6 106

接下来n行,每行一个整数 d i d_i di和一个字符串 s i s_i si,表示第i号位置上的玩具小人的朝向以及姓名(名字中没有空格),若 d i d_i di=0则表示朝向圈内,若 d i d_i di=1则表示朝向圈外。

接下来m行,每一行两个整数 a i a_i ai s i s_i si,表示第i条指令的内容,若 a i a_i ai=0则表示左数第 s i s_i si个人,若 a i a_i ai=1则表示右数第 s i s_i si个人。其中1≤ s i s_i si<n。

输出格式

输出一个字符串,表示从第一个玩具小人开始执行m条指令之后揭示出该玩具小人的姓名。

M3 后勤官

题目描述

《少女前线》是一款二次元枪娘养成战术手游。在架空历史的第三次世界大战之后,世界的秩序和稳定交由名为格里芬和克鲁格的私人军事承包商(G&K)来维护;游戏里,玩家需要扮演承包商旗下的一名指挥官,指挥战术少女。随着游戏的深入,您将一点一点知晓隐藏在这个世界背后巨大的阴谋。

作为一名优秀的指挥官,每当接到公司新派发的作战任务。首要的并不是拿上枪和少女们一同战斗。交付于玩家的使命比直接战斗更为重要。那就是战场指挥。通常来说,战场指挥只需要达到作战目的即可,可好的战场指挥更懂得最大化减少损失。

指挥作战的第一步是进行编队,在《少女前线》中,编队的界面如下图所示:

在这里插入图片描述

指挥官可以在某一梯队中,编入1~5名战术人形(0位那就不叫编队了),每位战术人形有各自的星级、等级、枪种、以及名字。人形下方的三条黄色代表其身上的装备品质,再下方的数字代表其作战效能。由于阵型连携效果的提升,全队作战效能会高于单个人形作战效能之和。指挥官还可以在右侧为每个梯队配备一个妖精——即无人机(你看到的妖精只是全息投影罢了),在战场上可以使用无人机对人形进行指挥作战,提升士气(加buff),还可以使用无人机对敌人进行打击(妖精技能)。

战术人形会使用烙印技术和自己的武器建立特殊的联系,使得战术人形在使用专属武器时拥有这极高的作战效率。在G&K中,战术人形的名字一般会以她们所持有的专属武器来命名,例如上述编队界面的M4A1,所持有的武器就是现实中美国柯尔特公司研制的M4卡宾枪改进型M4A1。

战斗的胜利除了有良好的指挥之外,还需要有优秀的后勤保障,弹药补给就是后勤保障的重点之一。在《少女前线》中,指挥官编入同一梯队的战术人形所使用的枪械,往往不是来自于现实中同一国家的枪械,这就导致各个人形所适用的弹药型号不同,对后勤部门带来了严峻的挑战。例如在上图中,M4A1、ST AR-15、M4 SOPMODⅡ、M16A1使用的均为5.56x45mm步枪弹,而RO635使用的为9x19mm帕拉贝鲁姆弹,这样这个队伍就只需要准备两种型号的弹药。碰上极端一点的情况,五位战术人形均使用不同型号的弹药,那么每次补给就需要对这个编队准备五种型号的弹药!

一般而言,指挥官是不会,也没有时间去考虑该如何为自己的战术人形补充弹药,考虑这些的是后勤官(Kalina)的责任。但是Kalina也有很多其他的任务需要完成,比如调配人力资源,分配口粮,整理装备,清点物资等等,对了,她还要时时刻刻帮指挥官撰写作战报告书!

万般无奈之下,Kalina只能找你——一位在G&K任职的文职人员(或者说,一个敲代码的?),她会向你提供指挥官所拥有的战术人形列表,以及每位战术人形所使用的弹药型号。之后她会告诉你指挥官的若梯队,她希望你能够帮她统计一下,每个梯队应该准备哪些型号的弹药?

输入格式

第一行一个整数n(n⩽300),代表指挥官手里拥有的战术人形数

之后n行,每行一个字符串,形如{name},ammo:{ammo_model},代表战术人形的名字{name}以及其适用的弹药型号{ammo_model}

战术人形的名字保证仅由ASCII字符组成且不含有’,’

弹药型号将以两种格式给出:

  • 形如5.56x45mm,其中x代表乘号,前面的数据代表弹头直径,后面的数据代表弹壳长度,最后表示单位——即保证其由数字+‘x’+数字+单位组成,保证仅有mm作为单位
  • 形如.45ACP,其中.45代表其弹头直径为0.45英寸,ACP是Automatic Colt
    Pistol(柯尔特自动手枪弹)的缩写——即保证其由’.'+数字+缩写组成,保证缩写不由数字开头且均为ASCII字符范围

之后一个整数m(m⩽14),代表指挥官的梯队数

之后m行,每行一个字符串,形如{name},…,{name},代表梯队中战术人形的名字,保证这些战术人形是指挥官所拥有并且Kalina的名单中有她。多个战术人形的名字将会用’,‘隔开,最后一个战术人形的名字后面不会有’,',此外保证梯队的人形数不超过5个

输出格式

m行,每行一个字符串,形如{ammo_model},…,{ammo_model},多个弹药型号之间用’,‘隔开,最后一种弹药后面不应该有’,’

此外,本题不存在special judge,输出还应当满足如下条件:

  • 形如5.56x45mm的弹药应当写在形如.45ACP的弹药前面
  • 同一类型的弹药,弹头直径较小的应当写在前面
  • 同一类型且弹头直径相同的,如果存在弹壳长度,则弹壳长度较小的应当写在前面
  • 同一类型且弹头直径相同的,如果不存在弹壳长度,则按照所带缩写的字典序排列

M4 逛遍CUGB

题目描述

小H是大一新生,刚来到CUGB对路不是很熟也有很多地方没有去过,他想去16楼、操场、教三楼、毛主席像、夏日广场等地方看看。他拥有一张地图,地图上有需要去的地点以及部分两个点之间的路径长度。

为了方便表示,地图上的点以数字表示,若小H要经过n处地方,则这n处地方的位置表示为1,2,…,n号点。

他是一个慵懒的人,他想问问你如何用最短的距离走过所有的点(可以重复)。

输入格式

第一行给出一个正整数n,m,表示小H一共需要经过n(1≤n≤17)个点,地图上已知m条边的总数。

接下来的m行每一行给出三个正整数u,v,w表示点u到点v的长度为w(1≤w≤500)。

注意:给出的图是一个无向图,并且不能保证点u到点v只有一条路能够直接到达。

输出格式

一行表示走过地图上的n个点的最短距离。

H1 打鼠鼠

题目描述

打地鼠游戏很好玩,对吧?那我们来沉浸式体验打地鼠。

假定草原上有n个坑排成一行,你手举一个大锤子虎视眈眈盯着各个洞口。身强体壮的你健步如飞,扛着大锤子都可以在单位时间内最多跨越V个坑洞,即从0号坑走到V号坑。

但是鼠鼠们都非常狡猾,它们每次出来探头都只会持续一瞬间,如果你此时不在洞口就打不到鼠鼠啦!

好在,上天在前一天给你托了一个梦,梦中告诉了你在Ti时刻第xi个洞口会有鼠鼠钻出来。你想知道,在预言梦的加持之下,你最多能打多少次鼠鼠?

(PS:初始时刻——0时刻你所站的位置是任意的,即可以自行确定。此外,每单位时间开始的瞬间,鼠鼠会探头一次,你只可以砸到你所在洞口探头的鼠鼠——如果有鼠鼠探头的话;在同一单位时间鼠鼠缩回去之后,你才可以移动)

输入格式

第一行两个正整数n,V(n⩽ 1 0 5 10^5 105,V⩽ 1 0 3 10^3 103),为坑洞数目(编号为0∼n)和你的速度

接下来n行每行两个整数 x i x_i xi, T i T_i Ti (0⩽ x i x_i xi< 1 0 8 10^8 108,0⩽ T i T_i Ti< 1 0 6 10^6 106),代表 T i T_i Ti 单位时间开始的瞬间第 x i x_i xi个洞口会有鼠鼠探头

输出格式

一行一个整数,代表你打到的鼠鼠个数

H2 LRU

题目描述

LRU——Least Recently Used,即最近最少使用算法,是一种常用的内存淘汰算法。它选择最近最久未使用的内存单元予以淘汰,腾出空间将需要使用的程序放入内存。

当用户要求执行某个程序的时候,计算机会尝试将程序放入内存,再予以执行。如果内存空间不够,则需要淘汰掉部分最近最久未使用的内存单元,再将该程序放入。

现给定一块容量为n的内存,再给出若干get、put操作,请按照LRU的实现方式实现内存管理。为了简化难度,我们假定内存可划分为n个单元,put操作需要占用恰好一个内存单元。

输入格式

第一行两个正整数n,m(n,m⩽ 1 0 6 10^6 106),分别代表内存大小和操作次数

之后m行,每行代表一个操作,形如:

  • put x y,表示向内存添加一个映射x→y(∣x∣,∣y∣⩽ 1 0 9 10^9 109)。如果已经存在映射x→z,则将其替换为x→y(注意:该操作也视为访问内存块)
  • get x,表示在内存中查询映射x指向的值,不存在则输出-1

输出格式

对于每个查询操作,输出一个值

H3 不要负数

题目描述

自然数非常good,负数非常bad,所以我们要自然数不要负数

现在给你n个+1,m个-1,将它们排成一个序列。认为一个序列是合法的,当且仅当其所有的前缀和都不小于0,求合法序列在所有序列中出现的概率?

保证m⩽n

输入格式

第一行一个整数T(T⩽ 1 0 5 10^5 105),代表接下来有T组测试数据
之后T行,每行两个正整数n,m(n,m⩽ 1 0 6 10^6 106),含义如上所示

输出格式

输出T行,每行一个小数(保留6位),表示每次询问的答案


往届校赛

2020

旅行前的准备

题目描述

LX同学想要游遍整个中国甚至全世界!所以这个国庆假期她计划去长沙玩。但是在她做旅行前的准备的时候,她收到了老师的作业,并且要求在国庆假期结束之前上交!LX同学非常的生气,告诉了你这个消息。你也觉得实在是太过分了,但是没有办法,只好帮助LX同学完成她的作业。

老师给了LX同学两个整数,分别是 x 和 y 。每次LX同学可以从中选择一个数 num ,把这个数变成 (num+2) mod p 或 (num∗2) mod p 或 (num∗num) mod p ,请问,最少需要多少次操作,能使这两个整数相等。

输入格式:

一行三个正整数 x,y,p(3≤p≤ 1 0 6 10^6 106,1≤x,y<p) ,保证p 是一个奇数。

输出格式:

一行一个整数表示最少操作次数。

tag

BFS

思路

  1. 分别对两个数做BFS,用数组step1记录x到达i最少需要几次操作,用数组step2记录y到达i最少需要几次操作。由于保证p是一个奇数,所以所有点都可以到达。
  2. 在第二次BFS的时候,并不是第一次遇到一个值x和y都可以到达就退出,因为所有点都是可以到达的,应该搜完之后ans=min(step1[i]+step2[i])。

代码

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define LL long long
const LL N = 10e6 + 10;
int step1[N],step2[N];
struct node{
    LL a;
    int cur;
    node(LL a,int cur):a(a),cur(cur){}
};
LL x,y,p;
int ans=0x3f3f3f3f;
void bfs1(){
    step1[x]=1;
    queue<node> q;
    q.push(node(x,1));
    while(!q.empty()){
        node u=q.front();
        q.pop();
        if(step1[u.a*2%p]==0) {step1[u.a*2%p]=u.cur+1;q.push(node(u.a*2%p,u.cur+1));}
        if(step1[(u.a+2)%p]==0) {step1[(u.a+2)%p]=u.cur+1;q.push(node((u.a+2)%p,u.cur+1));}
        if(step1[u.a*u.a%p]==0) {step1[u.a*u.a%p]=u.cur+1;q.push(node(u.a*u.a%p,u.cur+1));}
    }
}
void bfs2(){
    step2[y]=1;
    queue<node> q;
    q.push(node(y,1));
    ans=min(ans,step1[y]+step2[y]);
    while(!q.empty()){
        node u=q.front();
        q.pop();
        if(step2[u.a*2%p]==0) {step2[u.a*2%p]=u.cur+1;q.push(node(u.a*2%p,u.cur+1));}
        ans=min(ans,step1[u.a*2%p]+step2[u.a*2%p]);
        if(step2[(u.a+2)%p]==0) {step2[(u.a+2)%p]=u.cur+1;q.push(node((u.a+2)%p,u.cur+1));}
        ans=min(ans,step1[(u.a+2)%p]+step2[(u.a+2)%p]);
        if(step2[u.a*u.a%p]==0) {step2[u.a*u.a%p]=u.cur+1;q.push(node(u.a*u.a%p,u.cur+1));}
        ans=min(ans,step1[u.a*u.a%p]+step2[u.a*u.a%p]);
    }
}
void solve(){
    cin>>x>>y>>p;
    bfs1();
    bfs2();
    cout<<ans-2;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int _t;
    _t=1;
    //cin>>_t;
    while(_t--) solve();
    return 0;
}

还原二叉树

题目描述

给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。

输入格式:

输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。

输出格式:

输出为一个整数,即该二叉树的高度。

tag

二叉树遍历

思路

  1. 首先由前序遍历的第一个节点确认其为根节点root;
  2. 在中序遍历的结果中找到root,这时候可以知道在中序遍历结果中,root节点左边的节点为root的左子树的节点,而root节点右边的节点为root的右子树的节点;
  3. 依据上一步可以知道的左右子树的节点个数,可以在前序遍历的结果中把左子树和右子树的节点分开;
  4. 在左右子树中递归第1,2,3步直到节点为空。
  5. 而求高度的过程其实也不用建树,而直接找出递归的最大深度就行了。

故都的秋

题目描述

转眼间小w已经是四年级的学生了,想到自己可能不会再在北京快乐,小w学长决定开始规划自己的四年级在北京最后的旅行计划QAQ.

​众所周知,小w擅长《离散数学》,经过缜密的研究,他已经将北京抽象成一个由n个点和m条边组成的带权无向连通简单图,其中的点代表旅游景点,边代表这些旅行景点之间的道路,边权为两个旅行景点之间的道路长度。

而小w学长的旅行将从任意一个景点出发,而到达哪个景点也是随意的。并且小w学长从一个景点到另一个景点所需要的时间为他经过这些景点的道路的长度之和。

而为了节省体力同时也为了看到更有意思的风景,小w决定规划出一条用时第k小的旅游路线来游玩。但是小w好久不写程序了,你能帮帮他吗。

形式上来说,记Ai,j为点i到点j (1≤i<j≤n)中的最短用时,那么第k短路径的长度则为Ai,j(1≤i<j≤n)中第k小的值。

输入格式:

输入的第一行包括三个整数n,m,k,(2≤n≤2⋅ 1 0 5 10^5 105,n−1≤m≤min( n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n1),2⋅ 1 0 5 10^5 105),1≤k≤min( n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n1) ,400)),分别为图中的点的个数,边的个数,以及待求的k

接下来的m行,每行三个正整数x,y,w(1≤x,y≤n,1≤w≤ 1 0 9 10^9 109,x ≠ \neq =y)代表点x,y之间连有一条权值为w的边。

数据保证题目中的图为简单图,无自环和重边。并且题目中的图连通。

输出格式:

输出一个整数——用时第k短的路线的所用长度。

tag

思维,floyd

思路

  1. 如果你想好好做这道题,那么你应该可以想到最憨憨的做法——Floyd暴力跑,然后暴力排序,复杂度 O ( n 3 + 2 n 2 l o g n ) O(n^3+2n^2logn) O(n3+2n2logn),这样的写法赛前验题的期望得分是10分
  2. 注意到k很小,所以不妨考虑一下哪些边更有可能成为最短路,边权很大的边必然不太可能成为。
  3. 实际上只需要考虑最小的k条边,因为这样已经有k个点对的距离小于排好序后第k条边的距离了。
  4. 然后把这些点加入后离散化跑一个 O ( k 3 ) O(k^3) O(k3)的Floyd就行了。
  5. 时间复杂度 O ( m l o g m + k 3 + 2 k 2 l o g k ) O(mlogm+k^3+2k^2logk) O(mlogm+k3+2k2logk)

LX的旅行

题目描述

LX同学想要游遍整个中国甚至全世界!根据LX同学的了解,她有 m 个想见的人在她计划旅行的城市中。

第 i 个人居住在城市Pi,和LX的亲密度为 c i c_i ci

LX同学热爱旅行,并且做了充足的计划。她一共有 n 个想去的城市,这 n 个城市由n−1 条双向道路相连,任意两个城市是连通的。这样,这 n 个城市就组成了一个树形结构,显然,每两个城市有且仅有一条简单路径。

LX同学计划若干次旅行,每次从一个城市前往另一个城市,同时会去见路上的所有想见的人。由于LX同学十分热爱旅行,LX并不想见朋友花费她太多的时间,所以LX只会在一次旅行中见最多 k 个人,如果有超过 k 个人在LX这次的旅行路线中,LX只会去见和LX亲密度最高的 k 个人(保证第 k+1 亲密的人和第 k 亲密的人和LX同学的亲密度不相同)。

LX同学每次旅行之前,可能会有她想见的人的居住城市或亲密度发生变化,LX同学自然会打听消息并及时对计划做出调整。由于LX同学并不擅长计算,不确定自己的计划是否正确,请帮帮她计算她的每次旅行需要见哪些朋友。

输入格式:

第一行一个整数 n 表示一共有 n(1≤n≤4⋅ 1 0 4 10^4 104) 个城市,编号为 1,2,…n 。

接下来 n−1 行,每行两个整数 u i u_i ui v i v_i vi(1≤ u i u_i ui , v i v_i vi≤n) ,表示编号为 u i u_i ui v i v_i vi的城市之间有一条道路相连。

第 n 行,一个整数 m(1≤m≤4⋅ 1 0 4 10^4 104) 表示有 m 个LX同学想见的人。

接下来的 m 行,每行两个整数 c i c_i ci(1≤ c i c_i ci≤1000) 和 p i p_i pi(1≤ p i p_i pi≤n) 。表示第 i 个人和LX同学的亲密度和这个人的居住城市编号。

第 n+m+2 行,两个整数 q(1≤8⋅ 1 0 4 10^4 104) 和 k(1≤k≤20) ,表示操作次数和每次旅行最多见的人数。

接下来 q 行,每行三个整数 op,x,y,op 表示操作的类型,一共有以下三种操作类型:

  1. op=1 时表示LX同学将从城市 x 出发前往城市 y 。
  2. op=2 时表示编号为 x 的LX想见的人的将搬到城市 y 。
  3. op=3 时表示编号为 x 的LX想见的人和LX的亲密度变为 y 。

输出格式:

对于每一个 op=1 的询问,输出一行,从大到小输出LX同学在这次旅行中会见的人的亲密度。如果没有见到任何人,即旅行路线上没有想见的人,输出一行一个整数 −1

tag

重链剖分

思路

  1. 树上的路径问题,可以考虑使用树链剖分,把一条链分成O(logn)条链在线段树上解决。
  2. 需要维护路径上的前k大的值,由于k很小,考虑暴力在线段树上存储最大的k个亲密值,在线段树上做单点修改即可。
  3. 线段树的合并操作就是在O(k)的时间内归并左右子树的有序数组,可以自己模拟,也可以使用STL的库函数。
  4. 对于每个城市的所有亲密值用multiset存储,默认是从小到大排序,从大到小排序的写法为multiset<int,greater< int > >。注意删除某个值需要先使用find函数找到地址,否则可能会删除多个相等的值。每次修改之后在线段树上update。
  5. 询问的时候维护一个长度最大为k的答案数组,合并每一条链的答案即可。

2021

内卷的世界

qls班上一共有n个同学,为了减少内卷,他们决定商量如何面对期末项目。每个人都可以选择A,B,C,D的其中一个项目,并假设他们知道自己做某个项目会得到的分数,由于A项目最简单,这门课要求做项目A的人不超过k个。已知第i个同学做四个项目的分数分别对应为 a i a_i ai, b i b_i bi, c i c_i ci, d i d_i di。每个人可以选择四个项目之一并得到相应分数,

请问他们获得分数中最大值和最小值之差最小为多少。

输入格式:

第一行输入两个整数n,k。

接下来n行,第 i 行输入四个整数 a i a_i ai, b i b_i bi, c i c_i ci, d i d_i di。1≤k≤n≤ 1 0 5 10^5 105,1≤ d i d_i di c i c_i ci b i b_i bi a i a_i ai 1 0 9 10^9 109

输出格式:

输出一个正整数表示答案。

tag

优先队列

思路

  1. 每个人有四个分数可以选,但是选第一个分数的人数有限制,请最小化所有人得分的最大差值;
  2. 先让所有人选择第四个分数(最低的分数),然后每次让n个人中的最低分选择稍高一点的分数,并维护答案;
  3. 每次需要取出并更新最低分数的人,所以用优先队列来维护信息;
  4. n个人的最高分在维护的过程中是单调递增的,最低分就是小根堆的顶,更新过程中给维护答案即可。

代码

在这里插入图片描述


畅通工程

题目描述

有 n 个城市,城市之间道路,现在请你建造 n−1 条道路使城市连通。但不是任意两个城市之间都可以建造道路,必须两个城市之间相互友好才可以建造道路(这种相互友好的关系不具有传递性)。

根据你的了解,有 m 对城市之间相互友好,可以建造道路,并且预期建造的道路长度为 len, 建造这条道路的花费为 cost 。你希望建造的所有道路的长度之和与花费之和的比值最大。

输入格式:

第一行两个整数 n,m(1≤n≤m≤2⋅ 1 0 4 10^4 104),表示 n 个城市和 m 条可选道路,每个城市从 1 到 n 编号 。

接下来 m 行,每行四个整数 x,y,len,cost(1≤x≤n,1≤y≤n,1≤len≤ 1 0 6 10^6 106,1≤cost≤ 1 0 6 10^6 106) ,表示 x 城市和 y 城市之间相互友好,可花费 cost 建造长度为 len 的道路,不会出现自己和自己友好的情况。

输出格式:

输出建造道路的最大的长度和与花费和的比值,四舍五入保留 3 位小数。

tag

最优比率生成树

思路

  1. 那么对于这个题目,实际就是在分数规划的基础上,对{a,b} 的选择有了限制,要求是一个最小生成树。
  2. 把 a-mid*b 作为每条边的权值,如果最大生成树的权值大于等于0,mid就是可行的。
  3. 最大生成树只需要按照边权从大到小排序即可,其余操作和最小生成树没有区别。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值