2020.04.08 2020.04.08 2020.04.08【 N O I P NOIP NOIP普及组】模拟赛 C C C组 24 24 24 总结
概述:
这次比赛我 A K AK AK了,拿了 300 300 300分——其实这次比赛的题目确实很简单,很多人都是想难了。
第一题: S o c i a l Social Social D i s t a n c i n g Distancing Distancing 1 1 1
题目
题目描述
一种新型疾病,COWVID-19,开始在全世界的奶牛之间传播。Farmer John 正在采取尽可能多的预防措施来防止他的牛群被感染。
Farmer John 的牛棚是一个狭长的建筑物,有一排共 N 个牛栏(2≤N≤10^5)。有些牛栏里目前有奶牛,有些目前空着。得知“社交距离”的重要性,Farmer John 希望使得 D 尽可能大,其中 D 为最近的两个有奶牛的牛栏的距离。例如,如果牛栏 3 和 8 是最近的有奶牛的牛栏,那么 D=5。
最近两头奶牛新来到 Farmer John 的牛群,他需要决定将她们分配到哪两个之前空着的牛栏。请求出他如何放置这两头新来的奶牛,使得 D 仍然尽可能大。Farmer John 不能移动任何已有的奶牛;他只想要给新来的奶牛分配牛栏。
输入
输入的第一行包含 N。下一行包含一个长为 N 的字符串,由 0 和 1 组成,描述牛棚里的牛栏。0 表示空着的牛栏,1 表示有奶牛的牛栏。字符串中包含至少两个 0,所以有至少有足够的空间安置两头新来的奶牛。
输出
输出 Farmer John 以最优方案在加入两头新来的奶牛后可以达到的最大 D 值(最近的有奶牛的牛栏之间的距离)。
样例输入
14
10001001000010
样例输出
2
数据范围限制
测试点 1-6 满足 N≤10。
测试点 7-8 满足 N≤100。
测试点 9-11 满足 N≤5000。
测试点 12-15 满足 N≤10^5。
提示
在这个例子中,Farmer John 可以以这样的方式加入奶牛,使得牛栏分配变为 10x010010x0010,其中 x 表示新来的奶牛。此时 D=2。不可能在加入奶牛之后取到更大的 D 值。
解题思路
这道题目的方法是进行枚举暴力。
我们知道加入奶牛其实有
4
4
4种方法。
- 在两个间隙最长的地方分别加入 2 2 2个。
- 在一个最长的间隙中加入 2 2 2个奶牛。
- 在开头加入 1 1 1个奶牛。
- 在结尾加入 1 1 1个奶牛。
对于这四种方法,我们直接暴力就可以了。时间复杂度为 O ( n ) O(n) O(n)。
得分情况
比赛时得了 100 100 100分。
第二题: S o c i a l Social Social D i s t a n c i n g Distancing Distancing 2 2 2
题目
题目描述
由于高传染性的牛传染病 COWVID-19 的爆发,Farmer John 非常担忧他的奶牛们的健康。
尽管他尽了最大努力使他的 N 头奶牛们(1≤N≤1000)践行“社交距离”,还是有许多奶牛不幸染上了疾病。编号为 1…N 的奶牛们分别位于一条长直道路上的不同位置(相当于一维数轴),奶牛 i 位于位置 xi。Farmer John 知道存在一个半径 R,任何与一头被感染的奶牛距离不超过 R 单位的奶牛也会被感染(然后会传染给与其距离 R 单位内的奶牛,以此类推)。
不幸的是,Farmer John 并不确切知道 R 的值。他只知道他的哪些奶牛被感染了。给定这个数据,求出起初感染疾病的奶牛的最小数量。
输入
输入的第一行包含 N。以下 N 行每行用两个整数 x 和 s 描述一头奶牛,其中 x 为位置(0≤x≤10^6),s 为 0 表示健康的奶牛,1 表示染病的奶牛,并且所有可能因传播而染病的奶牛均已染病。
输出
输出在疾病开始传播之前已经得病的奶牛的最小数量。
样例输入
6
7 1
1 1
15 1
3 1
10 0
6 1
样例输出
3
数据范围限制
提示
在这个例子中,我们知道 R<3,否则位于位置 7 的奶牛会传染给位于位置 10 的奶牛。所以,至少 3 头奶牛初始时已被感染:位于位置 1 和 3 的两头奶牛中的一头,位于位置 6 和 7 的两头奶牛中的一头,以及位于位置 15 的奶牛。
解题思路
这道题我们首先要计算出
R
R
R的值。
如何求
R
R
R呢?
我们其实可以发现,
R
R
R就是最小的两个不同的状态的位置之差。
也就是
R
=
m
i
n
(
x
i
−
x
j
)
(
j
<
i
,
s
i
≠
s
j
)
R=min(x_i-x_j)(j<i,s_i\not=s_j)
R=min(xi−xj)(j<i,si=sj)
那么我们只要先排序在计算就行了。
我们现在要求的是疾病开始传播之前已经得病的奶牛的最小数量。
先算出一共有多少块得病的,设为
A
A
A。
块的定义是,一连串
1
1
1,没有
0
0
0。
比如:
110101
110101
110101
这个字符串就有
3
3
3块,每一块的长度分别为
2
2
2,
1
1
1,
1
1
1。
再算出符合
R
R
R的的块数,设为
B
B
B。
答案就是
A
+
B
A+B
A+B。
具体为什么可以用样例来试一下。
得分情况
比赛时 100 100 100分。
第三题: C o w n t a c t Cowntact Cowntact T r a c i n g Tracing Tracing
题目
题目描述
由于高传染性的牛传染病 COWVID-19 的爆发,Farmer John 非常担忧他的奶牛们(编号为 1…N)的健康。最近,Farmer John 对他的所有奶牛进行了检测,发现有一部分奶牛对该疾病的检测结果呈阳性。利用牛棚内的视频监控,他得以查看最近的奶牛之间的互动行为,结果发现奶牛们互相打招呼时,她们会握蹄,不幸的是这是一种会将疾病从一头奶牛传播给另一头奶牛的行为。Farmer John 汇总了一个添加了时间戳的清单,每条数据的形式为 (t,x,y),表示在时间 t,奶牛 x 与奶牛 y 握了蹄。Farmer John 同时还知道以下信息:
(一)他的农场上恰有一头奶牛最初带有携带疾病(我们将这头奶牛称为“零号病人”)。
(二)一旦一头奶牛被感染,她会在接下来的 K 次握蹄中传染疾病(可能会与同一头奶牛握蹄多次)。握蹄 K 次后,她不再在此后的握蹄中传染疾病(因为此时她意识到了她会传染疾病,于是会仔细地洗蹄)。
(三)一旦一头奶牛被感染,她会持续处于被感染状态。
不幸的是,Farmer John 不知道他的 N 头奶牛中的哪一头是零号病人,也不知道 K 的值!基于他的数据,请帮助他缩小这些未知量的范围。保证至少有一种可能的情况。
输入
输入的第一行包含 N(2≤N≤100)和 T(1≤T≤250)。下一行包含一个长为 N 的字符串,每个字符均为 0 或 1,表述目前 Farmer John 的 N 头奶牛的状态——0 表示一头健康的奶牛,1 表示一头染病的奶牛。以下 T 行每行包含 Farmer John 的互动清单中的一条记录,由三个整数 t、x 和 y组成,其中 t 为一次互动发生的正整数时间(t≤250),x 和 y 为范围 1…N 内的不同整数,表示时间 t 握蹄的两头奶牛。在每一时刻至多只有一次互动发生。
输出
输出一行,包含三个整数 x、y 和 z,其中 x 为可能为零号病人的奶牛数量,y 为与数据一致的最小可能 K 值,z 为与数据一致的最大可能 K 值(如果通过数据无法推断 K 的上界,z 输出 "Infinity")。注意可能有 K=0。
样例输入
4 3
1100
7 1 2
5 2 3
6 2 4
样例输出
1 1 Infinity
数据范围限制
提示
唯一可能是零号病人的是奶牛 1。对于所有的 K>0,奶牛 1 在时刻 7 感染奶牛 2,而奶牛 3 和奶牛 4 均不会被感染。
解题思路
这道题的方法是暴力枚举。
我们直接枚举
0
0
0号病人和
K
K
K,然后判断是否正确。
具体判断:
我们先把
0
0
0号病人给标记为有病,然后看是否可以传染(次数
+
1
+1
+1还是小于等于
K
K
K),如果可以,就把那个跟他握手的人标记为有病。
最后只要看一下最后标记的是否与输入的一致,就行了。
得分情况
比赛时 100 100 100分。
总结:
这次比赛难度不算大,下次继续努力!