2019暑期集训 - Day 21
每次订正都是一段艰辛的过程
概述
提高 B 组
4题:T0 , T1 , T2 , T3
170/400 分
25/119 名
T0 最小比例(ratio)
WA 90/100 分
Description
图中共有 \(N\) 个点的完全图,每条边都有权值,每个点也有权值。要求选出 \(M\) 个点和 \(M-1\) 条边,构成一棵树,使得:
\(Ratio=\dfrac{\sum edge\ weight}{\sum node\ weight}\)
即所有边的权值与所有点的权值之和的比率最小。
给定 \(N\) 和 \(M\) ,以及 \(N\) 个点的权值,和所有的边权,要求 \(M\) 个点的最小比率生成树。
Input
第一行包含两个整数 \(N\) 和 \(M(2\le N\le 15\ ,\ 2\le M\le N)\) ,表示点数和生成树的点数。
接下来一行 \(N\) 个整数,表示 \(N\) 个点的边权。
最后 \(N\) 行,每行 \(N\) 列,表示完全图中的边权。所有点权和边权都在 \([1,100]\) 之间。
Output
输出最小比率生成树的 \(M\) 个点。当答案出现多种时,要求输出的第一个点的编号尽量小,第一个相同,则第二个点的编号尽量小,依次类推,中间用空格分开。编号从 \(1\) 开始。
Sample Input
输入1:
3 2
30 20 10
0 6 2
6 0 3
2 3 0
输入2:
2 2
1 1
0 2
2 0
Sample Output
输出1:
1 3
输出2:
1 2
Hint
对于30% 数据, \(N\le 5\) 。
Solution
这么简单?
枚举每个点选不选,然后以选中的那些点建图,跑 Kruskal ,记录答案最小值,没了。
T1 软件公司(company)
TLE 60/100 分
Description
一家软件开发公司有两个项目,并且这两个项目都由相同数量的 \(m\) 个子项目组成,对于同一个项目,每个子项目都是相互独立且工作量相当的,并且一个项目必须在 \(m\) 个子项目全部完成后才算整个项目完成。
这家公司有 \(n\) 名程序员分配给这两个项目,每个子项目必须由一名程序员一次完成,多名程序员可以同时做同一个项目中的不同子项目。
求最小的时间 \(T\) 使得公司能在T时间内完成两个项目。
Input
第一行两个正整数 $n,m\ (1\le n\le 100\ ,\ 1\le m\le 100) $ 。
接下来 \(n\) 行,每行包含两个整数, \(x\) 和 \(y\) 。分别表示每个程序员完成第一个项目的子程序的时间,和完成第二个项目子程序的时间。每个子程序耗时也不超过 \(100\) 。
Output
输出最小的时间 \(T\) 。
Sample Input
3 20
1 1
2 4
1 6
Sample Output
18
Hint
【样例解释】
第一个人做 \(18\) 个 \(2\) 项目,耗时 \(18\) ;第二个人做 \(2\) 个 \(1\) 项目, \(2\) 个 \(2\) 项目耗时 \(12\) ;第三个人做 \(18\) 个 \(1\) 项目,耗时 \(18\) 。
【数据范围】
对于30% 的数据, \(n\le 30\)
对于60% 的数据, \(n\le 60\)
Solution
DP 二分答案
设 \(f[i][j]\) 代表在当前尝试的总耗时中如果前 \(i\) 个做了 \(j\) 个 \(1\) 项目,最多能做多少个 \(2\) 项目。
我们二分耗时,对于每次尝试,如果 \(f[n][m]\ge m\) ,那么说明可能有多余出来的时间,向右二分答案;否则向左。
T2 空间航行(warp)
WA 10/100 分
Description
你是一艘战列巡洋舰的引擎操作人员,这艘船的船员在空间中侦测到了一些无法辨识的异常信号。你的指挥官给你下达了命令,让你制定航线,驾驶战列巡洋舰到达那里。
船上老旧的曲速引擎的速度是 \(0.1AU/s\) 。然而,在太空中分布着许多殖民星域,这些星域可以被看成一个球。在星域的内部,你可以在任何地方任意次跳跃到星域内部的任意一个点,不花费任何时间。
你希望算出到达终点的最短时间。
Input
输入包含多组测试数据。
对于每一组数据,第一行包含一个正整数 \(n\) ,表示殖民星域的数量。
接下来 \(n\) 行,第 \(i\) 行包含四个整数 \(X_i,Y_i,Z_i,R_i\) ,表示第 \(i\) 个星域的中心坐标为 \((X_i,Y_i,Z_i)\) ,星域的半径是 \(R_i\)。
接下来两行,第一行包含值 \(X_a,Y_a,Z_a\) ,告诉你当前坐标为 \((X_a,Y_a,Z_a)\)。
第二行包含值 \(X_o,Y_o,Z_o\) ,告诉你目的地坐标为 \((X_o,Y_o,Z_o)\) 。
输入以一行单独的 \(-1\) 结尾。所有坐标的单位都是天文单位( \(AU\))。
Output
对于每一组输入数据,输出一行表示从目前的位置到达指定目的地的最短时间,取整到最近整数。输入保证取整是明确的。
Sample Input
1
20 20 20 1
0 0 0
0 0 10
1
5 0 0 4
0 0 0
10 0 0
-1
Sample Output
100
20
Hint
每个输入文件至多包含 \(10\) 个测试数据。
对于10% 的数据, \(n = 0\) 。
对于30% 的数据, \(0\le n\le 10\)。
对于100% 的数据, \(0\le n\le 100\) ,所有坐标的绝对值 \(\le 10000\) ,半径 \(r\le 10000\) 。
你可以认为,你所在的星区的大小为无限大。
Solution
没想到这题正解竟然如此简单!!!
在两个星域的球的之间航行的时间等于两个球心之间的距离减去两个球的半径!
将每个球的球心当作点建图,然后跑最短路不就行了?
Floyd 都能过!
T3 摧毁巴士站(bus)
WA 10/100 分
Description
Gabiluso 是最伟大的间谍之一。现在,他试图完成一个“不可能完成”的使命――减缓 Colugu 的军队到达机场的时间。 Colugu 有 \(n\) 个公共汽车站和 \(m\) 条道路。每条道路直接连接两个巴士站,所有的道路都是单向的。为了保持空气洁净,政府禁止所有军用车辆,因此,军队必须乘搭巴士去机场。两个巴士站之间,可能有超过一条道路。如果一个公共汽车站被破坏时,所有连接该站的道路将无法运作。 Gabiluso 需要做的是摧毁了一些公共汽车站,使军队无法在 \(K\) 分钟内到达机场。一辆公交车通过一条道路,都是一分钟。所有巴士站的编号从 \(1\) 到 \(n\) 。 \(1\) 号巴士站是在军营,第 \(n\) 号站是机场。军队始终从第一站出发。第一站和第 \(n\) 站不能被破坏,这里有大量的防御力量。当然也没有从第 \(1\) 站到第 \(n\) 站的道路。
请帮助 Gabiluso 来计算能完成使命所需摧毁的最低数目的巴士站。
Input
第一行包含三个整数 \(n,m,k\ (2<n\le 50\ ,\ 0<m\le 4000\ ,\ 0<k<1000)\) 。
接下来 \(m\) 行,每行 \(2\) 个整数 \(s\) 和 \(f\) ,表示从站 \(s\) 到站 \(f\) 有一条路。
Output
输出最少需要摧毁的巴士站数目。
Sample Input
5 7 3
1 3
3 4
4 5
1 2
2 5
1 4
4 5
Sample Output
2
Hint
30% 的数据 \(N\le 15\) 。
Solution
为什么正解在我看来一点不像正解?
每次跑从 \(1\) 到 \(n\) 的最短路,并记录下这条路。
然后枚举炸毁这条路上的其中一个点,然后重新递归上面的过程。
直到有一次的最短路 \(\ge k\) ,就更新答案。
当然,如果已炸毁的点数已经大于了答案,就应该跳回去,避免无意义操作。
然后就没了???好怪啊 . . .
骗分大法
1.打表
既然是打表,那能用上的优化就用上,能早点开始打就早点,能打多少就打多少,直到代码长度超限 . . .
2.特殊值
注意题目中的特殊要求和特值,注意构造在平常算法中耗时非常高的测试点,针对它们做出特值的答案,比如 \(0\ ,\ 1\ ,\ n\) 等等。
3.Greedy , Sortings
不会做就上贪心或者暴力,一般总能拿几分,有些时候贪心还能骗到过半的分数,甚至口胡出正解。

浙公网安备 33010602011771号