比赛链接: here 编程之美复赛,四个简单题! 勉强可以混了个#26。 A题:here
时间限制:2000ms
单点时限:1000ms
内存限制:256MB
描述
Z国有n个城市,编号为1, 2, …, n。城市间通过n – 1条道路相连,任意两个城市间有且仅有一条路径可以相互到达。每个城市都有一些货物,政府希望将所有的货物运送到港口城市s以便出口。由于交通条件限制,每一条道路上单位时间只能通过1单位量的货物,这导致运输所有货物可能非常耗时。因而,政府希望知道,最快什么时候能将所有货物运送到港口。
输入
第一行一个整数T,表示数据组数,以下是T组数据。 每组数据第一行有两个整数n和s,表示城市个数和港口城市的编号。接下来n - 1行每行两个整数i和j,表示城市i和j之间有一条道路。接下来n行每行一个数x,表示各城市的货物数量。
输出
对每组数据输出一行”Case #X: Y”,X表示数据编号(从1开始),Y为完成运输任务的最短时间。
数据范围
1 ≤ T ≤ 20 小数据 1 ≤ n ≤ 500 0 ≤ x ≤ 20 大数据 1 ≤ n ≤ 100000 0 ≤ x ≤ 100000
样例输入
2
3 2
1 2
2 3
1
2
1
5 1
1 2
2 3
2 4
2 5
5
1
2
2
1
样例输出
Case #1: 1
Case #2: 6
A题感觉题意没有非常清楚。 好像一个单位时间是可以走任意条边的。然后只需要输出 s 的子树大小的最大值。 好多做法都可以水过,不能多说。 复杂的方法就不会了。TAT 代码就不贴了。
B题: here
#1169 : 猜数字
时间限制:10000ms
单点时限:5000ms
内存限制:256MB
描述
你正在和小冰玩一个猜数字的游戏。小冰首先生成一个长为N的整数序列A1, A2, …, AN。在每一轮游戏中,小冰会给出一个区间范围[L, R],然后你要猜一个数K。如果K在AL, AL+1, …, AR中,那么你获胜。 在尝试了几轮之后,你发现这个游戏太难(无聊)了。小冰决定给你一些提示,你每猜一次,小冰会告诉你K与AL, AL+1, …, AR中最接近的数的绝对差值,即min(|Ai - K|), L ≤ i ≤ R。 现在,请你实现这个新功能。
输入
第一行为一个整数T,表示数据组数。 每组数据的第一行为两个整数N和Q。 第二行为N个由空格分开的整数,分别代表A1, A2, …, AN。 接下来Q行,每行三个由空格隔开的整数L、R、K。
输出
每组数据的先输出一行”Case #X:”,X为测试数据编号。 接下来对每个询问输出一行,每行为一个整数,即为所求的值。
数据范围
1 ≤ T ≤ 20 0 ≤ Ai, K ≤ 109 1 ≤ L ≤ R ≤ N 小数据 1 ≤ N, Q ≤ 1000 大数据 1 ≤ N, Q ≤ 200000 输入数据量较大,推荐使用scanf / BufferedReader等IO方法。
样例输入
1
9 3
1 8 3 4 9 2 7 6 5
1 9 10
3 7 9
5 6 5
样例输出
Case #1:
1
0
3
裸题。 我是直接上的主席树。然后比赛时候姿势不够优美,TLE了大数据。 赛后修改下过了。 另外一种方法就是离线一发。然后直接从小大到一遍,只需要查询区间最大值。 然后从大到小一遍,查询区间最小值。 一个线段树足矣。
1 | /* *************** |
C题: here
#1170 : 机器人
时间限制:2000ms
单点时限:1000ms
内存限制:256MB
描述
小冰的N个机器人兄弟排成一列,每个机器人有一个颜色。现在小冰想让同一颜色的机器人聚在一起,即任意两个同颜色的机器人之间没有其他颜色的的机器人。 假设任意相邻的两个机器人可以交换位置,请问最少需要多少次交换?
输入
第一行为一个整数T,为数据组数,之后每组数据两行。 第一行为N和K,表示机器人的个数与颜色的总数。 接下来一行N个数,第i个数表示第i个机器人的颜色,取值范围为1到K。
输出
对于每组数据输出一行,形如”Case #X: Y”。X为数据组数,从1开始,Y为最少的交换步数。
数据范围
1 ≤ T ≤ 20 1 ≤ N ≤ 105 小数据 1 ≤ K ≤ 3 大数据 1 ≤ K ≤ 16
样例输入
3
4 2
1 2 1 2
6 4
2 1 4 3 1 2
8 6
1 3 2 5 5 4 5 2
样例输出
Case #1: 1
Case #2: 6
Case #3: 5
首先相同颜色的相对顺序是不会改变的。交换次数其实就是逆序数。 然后就可以进行状态压缩DP。 我只需要知道前面选了哪些颜色。然后后面加入一种颜色的时候,就可以算出增加多少逆序对。
1 | /* *************** |
D题: here
#1171 : 城市和魔法塔
时间限制:2000ms
单点时限:1000ms
内存限制:256MB
描述
2D平面上有M座城市,你被任命保卫这些城市。有两种方案可供选择。 1. 直接使用G枚金币为一座城市构建城防系统。 2. 平面上还有N座古老的魔法塔。你可以激活它们,代价为一座魔法塔P枚金币。任意两座激活的魔法塔之间可以直线连接,构建魔法屏障,被魔法屏障包围的那些城市会被保护。 现在给定城市与魔法塔的坐标,求最小的代价。 如上图所示,方块表示城市,黑色圆表示激活的魔法塔,白色圆表示未激活的魔法塔,直线表示构建的魔法屏障。按照上图的方式,费用为6P + G。
输入
第一行为一个整数T,为数据组数,之后每组数据若干行。 第一行为四个整数,N, M, G, P,分别代表魔法塔个数、城市个数、城防系统代价、激活魔法塔代价。 接下来N行,每行两个整数,表示魔法塔的坐标。 接下来M行,每行两个整数,表示城市的坐标。
输出
对于每组数据输出一行”Case #X: Y”,X为数据组数,从1开始,Y为最少的代价。
数据范围
1 ≤ T ≤ 100 1000 ≤ G ≤ 2000 100 ≤ P ≤ 200 所有坐标范围在0至1000之间,所有点(包括城市与魔法塔)没有重合,没有三点共线。 小数据 0 ≤ N, M ≤ 10 大数据 0 ≤ N, M ≤ 100
样例输入
2
7 6 1000 100
0 0
20 0
1 10
39 10
1 20
39 20
20 30
3 9
37 9
3 21
37 21
18 24
50 24
4 3 1500 100
0 0
0 10
10 0
10 10
5 4
4 1
8 6
样例输出
Case #1: 1600
Case #2: 300
原题。 当年写过一发题解: here 能圈的肯定要圈起来。 然后就是选最少的点,来圈起来了。 floyed 一发就好。
1 | /* *************** |