#P14205. [ROI 2016 Day1] 要塞防御

[ROI 2016 Day1] 要塞防御

题目背景

译自 ROI 2016 Day1 T1. Оборона крепости

题目描述

被围困的要塞之墙由 nn 个防御段组成,这些防御段从 11nn 编号。侦察报告称,在下一次进攻中,敌人将派出 aia_i 名士兵进攻编号为 ii 的防御段。要塞共有 ss 名守卫,需要分配到这些防御段上。

不同的防御段加固程度不同,这导致了防守效率的差异。编号为 ii 的防御段上,每一名守卫都能抵御 kik_i 名进攻者。假设编号为 ii 的防御段上派遣了 xix_i 名守卫。那么,如果敌人的数量不超过 xikix_i \cdot k_i,则该段防线将完全守住,不会有敌人突破;否则,将有 aixikia_i - x_i \cdot k_i 名敌人突破防线,攻入要塞。

你的任务是编写一个程序,合理分配守卫人数,使得总人数恰好为 ss,并使得突破要塞的敌人数最少。

输入格式

输入的第一行包含两个整数 nnss,分别表示防御段的数量和要塞的守卫总数(1n1000001 \le n \le 100\,0001s1091 \le s \le 10^9)。

接下来的 nn 行中,每行包含两个整数 ai,kia_i, k_i,分别表示进攻编号为 ii 的防御段的敌人总数,以及该段上每名守卫能够抵御的敌人数(1ai,ki1091 \le a_i, k_i \le 10^9)。

输出格式

输出一个整数——即最少能突破要塞的敌人数。

1 10
8 1
0
3 3
4 2
1 1
10 8
3

提示

样例解释

在第一个测试中,如果将全部 1010 名守卫派往唯一的防御段,他们可以击退所有 88 名敌人,因此不会有敌人突破防线。

在第二个测试中,一种可行的方案是将 22 名守卫派往第一个防御段,将 11 名守卫派往第三个防御段,这样可以使突破的敌人数量最小化。

数据范围

子任务编号 分值 nn ss aa kk 必须通过的子任务
1 17 1n1001 \le n \le 100 1s100001 \le s \le 10\,000 1ai1001 \le a_i \le 100 ki=1k_i = 1
2 21 ki2k_i \le 2 1
3 23 1ki1001 \le k_i \le 100 1, 2
4 39 1n1000001 \le n \le 100\,000 1s1091 \le s \le 10^9 1ai1091 \le a_i \le 10^9 1ki1091 \le k_i \le 10^9 1, 2, 3

翻译由 ChatGPT-5 完成