2020.04.11【NOIP普及组】模拟赛C组25 总结

2020.04.11 2020.04.11 2020.04.11 N O I P NOIP NOIP普及组】模拟赛 C C C 25 25 25 总结

这次比赛我考了 180 180 180分,本来是可以拿 250 250 250分的,就是因为排序写错了丢了 70 70 70分。

第一题: B e r r y Berry Berry P i c k i n g Picking Picking

题目

题目描述
Bessie 和她的妹妹 Elsie 正在 Farmer John 的浆果园里采浆果。Farmer John 的浆果园里有 N 棵浆果树(1≤N≤1000);树 i 上有 Bi 个浆果(1≤Bi≤1000)。Bessie 有 K 个篮子(1≤K≤1000,K 为偶数)。每个篮子里可以装同一棵树上采下的任意多个浆果,但是不能装来自于不同的树上的浆果,因为它们的口味可能不同。篮子里也可以不装浆果。
Bessie 想要使得她得到的浆果数量最大。但是,Farmer John 希望 Bessie 与她的妹妹一同分享,所以 Bessie 必须将浆果数量较多的 K/2 个篮子给 Elsie。这表示 Elsie 很有可能最后比 Bessie 得到更多的浆果,这十分不公平,然而姐妹之间往往就是这样。
帮助 Bessie 求出她最多可以得到的浆果数量。

输入
输入的第一行包含空格分隔的整数 N 和 K。
第二行包含 N 个空格分隔的整数 B1,B2,,BN。

输出
输出一行,包含所求的答案。

样例输入
5 4
3 6 8 4 2

样例输出
8

数据范围限制
测试点 1-3 满足 K≤10。
测试点 4-10 没有额外限制。

提示
如果 Bessie 在一个篮子里装树 26 个浆果
两个篮子里每个装树 34 个浆果
一个篮子里装树 44 个浆果
那么她能够得到两个各装有 4 个浆果的篮子,总共 8 个浆果。

解题思路

这道题目的解题方法是贪心。
我们直接枚举每个篮子分的浆果数再判断排序就行了。
时间复杂度为 O ( max ⁡ i = 1 n b i ⋅ n log ⁡ n 2 ) O(\max_{i=1}^{n}{b_i}\cdot n\log_n^2) O(maxi=1nbinlogn2)

得分情况

比赛时 60 60 60分,改完之后满分。

第二题: L o a n Loan Loan R e p a y m e n t Repayment Repayment

题目

题目描述
Farmer John 欠了 Bessie N 加仑牛奶(1≤N≤10^12)。他必须在 K 天内将牛奶给 Bessie。但是,他不想将牛奶太早拿出手。另一方面,他不得不在还债上有所进展,所以他必须每天给 Bessie 至少 M 加仑牛奶(1≤M≤10^12)。
以下是 Farmer John 决定偿还 Bessie 的方式。首先他选择一个正整数 X。然后他每天都重复以下过程:
(1)假设 Farmer John 已经给了 Bessie G 加仑,计算 (N−G)/X 向下取整。令这个数为 Y。
(2)如果 Y 小于 M,令 Y 等于 M。
(3)给 Bessie Y 加仑牛奶。
求 X 的最大值,使得 Farmer John 按照上述过程能够在 K 天后给 Bessie 至少 N 加仑牛奶 (1≤K≤10^12)。

输入
输入仅有一行,包含三个空格分隔的正整数 N、K 和 M,满足 K⋅M<N。
注意这个问题涉及到的整数规模需要使用 64 位整数类型(例如,C/C++ 中的“long long”)。

输出
输出最大的正整数 X,使得按照上述过程 Farmer John 会给 Bessie 至少 N 加仑牛奶。

样例输入
10 3 3

样例输出
2

数据范围限制
测试点 1-3 满足 K≤10^5。
测试点 4-10 没有额外限制。

提示
在这个测试用例中,当 X=2 时 Farmer John 第一天给 Bessie 5 加仑,后两天每天给 Bessie M=3 加仑。

解题方法

这道题目的方法是二分答案+数学。

对于 30 30 30%的数据:

我们只要二分答案,然后直接模拟 k k k天就行了。
时间复杂度为 O ( k log ⁡ n 2 ) O(k\log_n^2) O(klogn2)

对于 100 100 100%的数据:

我们要二分答案 x x x,对上面的办法进行优化。
假设当天要给的牛奶数是 y y y,一共有连续 a a a天要给一样的数量,然而还有 g g g个牛奶没给,还剩下 t t t天要给牛奶。
那么,我们可以知道第 a a a天要给 y y y   ( 1 ) \:(1) (1),第 a + 1 a+1 a+1天给的数量一定比 y y y要小   ( 2 ) \:(2) (2)

⌊ g − ( a − 1 ) y x ⌋ = y   ( 1 ) \lfloor \frac{g-(a-1)y}{x} \rfloor=y\:(1) xg(a1)y=y(1)
⌊ g − a y x ⌋ < y   ( 2 ) \lfloor \frac{g-ay}{x} \rfloor<y\:(2) xgay<y(2)

简化 1 1 1

把向下取整去掉,得
g − ( a − 1 ) y x ≥ y \frac{g-(a-1)y}{x}\geq y xg(a1)yy
两边同时乘以 x x x,得
g − ( a − 1 ) y ≥ x y {g-(a-1)y}\geq xy g(a1)yxy
两边同时除以 y y y,得
g y − ( a − 1 ) ≥ x \frac{g}{y}-(a-1)\geq x yg(a1)x
拆括号,得
g y − a + 1 ≥ x \frac{g}{y}-a+1\geq x yga+1x
整理出关于 a a a的式子,得
g y − x + 1 ≥ a \frac{g}{y}-x+1\geq a ygx+1a

简化 2 2 2

把向下取整去掉,得
g − a y x < y \frac{g-ay}{x}<y xgay<y
两边同时乘以 x x x,得
g − a y < x y g-ay<xy gay<xy
两边同时除以 y y y,得
g y − a < x \frac{g}{y}-a<x yga<x
整理出关于 a a a的式子,得
g y − x < a \frac{g}{y}-x<a ygx<a

整理 1 1 1 2 2 2

将两个式子合并,得
g y − x < a ≤ g y − x + 1 \frac{g}{y}-x<a\leq \frac{g}{y}-x+1 ygx<aygx+1
因为 a a a是整数,所以
a = ⌊ g y − x + 1 ⌋ a=\lfloor \frac{g}{y}-x+1 \rfloor a=ygx+1

所以我们只要进行分块计算,也就是一次计算 a a a次,这样就会提高效率。
但是有时候 a a a会大于你剩下的天数 t t t,就会越界,所以
a = min ⁡ ( ⌊ g y − x + 1 ⌋ , t ) a=\min(\lfloor \frac{g}{y}-x+1 \rfloor,t) a=min(ygx+1,t)

我们只需要这样做:将 g g g减去 a a a乘以 y y y,得到剩下要给的牛奶数,然后再将 t t t减去 a a a,得到剩下的天数。
注:上面的运算仅限于 y > m y>m y>m
如果 y < = m y<=m y<=m,我们应该直接把剩下的所有都拿走,也就是将 g g g减去 y y y乘以 t t t,然后 t = 0 t=0 t=0
这道题就这样被解决了,时间复杂度大概为 O ( n log ⁡ n 2 ) O(\sqrt{n}\log_{n}^{2}) O(n logn2),可以过 n ≤ 1 0 12 n\leq10^{12} n1012的数据。

得分情况

比赛时满分。

第三题: W o r m h o l e Wormhole Wormhole S o r t Sort Sort

题目

题目描述
Farmer John 的奶牛们已经厌倦了他对她们每天早上排好序离开牛棚的要求。她们刚刚完成了量子物理学的博士学位,准备将这一过程搞快点。
今天早上,如同往常一样,Farmer John 的 N 头编号为 1…N 的奶牛(1≤N≤10^5),分散在牛棚中 N 个编号为 1…N 的不同位置,奶牛 i 位于位置 pi。但是今天早上还出现了 M 个编号为 1…M 的虫洞(1≤M≤10^5),其中虫洞 i 双向连接了位置 ai 和 bi,宽度为 wi(1≤ai,bi≤N,ai≠bi,1≤wi≤10^9)。
在任何时刻,两头位于一个虫洞两端的奶牛可以选择通过虫洞交换位置。奶牛们需要反复进行这样的交换,直到对于 1≤i≤N,奶牛 i 位于位置 i。
奶牛们不想被虫洞挤坏。帮助她们最大化被她们用来排序的虫洞宽度的最小值。保证奶牛们有可能排好序。

输入
输入的第一行包含两个整数 N 和 M。
第二行包含 N 个整数 p1,p2,,pN。保证 p 是 1…N 的一个排列。
对于 1 到 M 之间的每一个 i,第 i+2 行包含整数 ai、bi 和 wi。

输出
输出一个整数,为在排序过程中奶牛必须挤进的虫洞的最小宽度的最大值。如果奶牛们不需要用任何虫洞来排序,输出 −1。

样例输入
4 4
3 2 1 4
1 2 9
1 3 7
2 3 10
2 4 3

样例输出
9

数据范围限制
测试点 1-5 满足 N,M≤1000。
测试点 6-10 没有额外限制。

提示
​以下是一个仅用宽度至少为 9 的虫洞给奶牛排序的可能方案:
奶牛 1 和奶牛 2 使用第三个虫洞交换位置。
奶牛 1 和奶牛 3 使用第一个虫洞交换位置。
奶牛 2 和奶牛 3 使用第三个虫洞交换位置。

解题方法

这道题我们直接用并查集就可以过了。
我们可以用并查集来建造地图并判断连通。
时间复杂度为 O ( n log ⁡ n 2 ) O(n\log_n^2) O(nlogn2),注意这个复杂度是排序的复杂度。

得分情况

比赛时 50 50 50分,改题后满分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值