顿顿总共选中了
块区域准备开垦田地,由于各块区域大小不一,开垦所需时间也不尽相同。据估算,其中第 块()区域的开垦耗时为 天。这 块区域可以同时开垦,所以总耗时 取决于耗时最长的区域,即:
为了加快开垦进度,顿顿准备在部分区域投入额外资源来缩短开垦时间。具体来说:
在第
块区域每投入 单位资源,便可将其开垦耗时缩短
天;
耗时缩短天数以整数记,即第
的整数倍;
在第
天;
这里的
天完成开垦。
现在顿顿手中共有
单位资源可供使用,试计算开垦块区域最少需要多少天?
从标准输入读入数据。
输入共
行。
输入的第一行包含空格分隔的三个正整数
、 和,分别表示待开垦的区域总数、顿顿手上的资源数量和每块区域的最少开垦天数。
接下来
行,每行包含空格分隔的两个正整数 和 ,分别表示第 块区域开垦耗时和将耗时缩短天所需资源数量。
输出到标准输出。
输出一个整数,表示开垦
块区域的最少耗时。
- 4 9 2
- 6 1
- 5 1
- 6 2
- 7 1
Data
5
Data
如下表所示,投入
单位资源即可将总耗时缩短至 天。此时顿顿手中还剩余单位资源,但无论如何安排,也无法使总耗时进一步缩短。
基础耗时 缩减 天所需资源投入资源数量 | 实际耗时 | |||
---|---|---|---|---|
1 | 6 | 1 | 1 | 5 |
2 | 5 | 1 | 0 | 5 |
3 | 6 | 2 | 2 | 5 |
4 | 7 | 1 | 2 | 5 |
- 4 30 2
- 6 1
- 5 1
- 6 2
- 7 1
Data
2
Data
投入
单位资源,恰好可将所有区域开垦耗时均缩短为 天;受限于 ,剩余的单位资源无法使耗时进一步缩短。
;
全部的测试数据满足:
且 。- #include <iostream>
- using namespace std;
- #include <map>
-
- // 按照从大到小的方式排列
- map<int,int,greater<int>> u_map;
- int main(int argc, char const *argv[])
- {
- int n,m,k;
- int i;
- int t,c;
-
- cin >> n >> m >>k;
- for (i = 0; i < n; i++){
- scanf("%d%d",&t,&c);
- u_map[t]+=c;
- }
-
- map<int,int>::iterator it;
-
- // 取天数最大的那一类田地
- it = u_map.begin();
- t = (*it).first;
- c = (*it).second;
-
- // 特判
- if (t <= k){
- cout << k << endl;
- return 0;
- }
-
- while (c <= m && m > 0){
- // 耗费c单位的资源,使天数减少1
- u_map[t-1] += c;
- m -= c;
- u_map.erase(t);
-
- t = t-1;
- // 要保证k是最小开垦天数
- if (t <= k){
- break;
- }
- c = u_map[t];
- }
-
- cout << max(t,k);
- return 0;
- }