【csp202303-2】垦田计划

问题描述

 输入格式

 输出格式

样例1输入

4 9 2
6 1
5 1
6 2
7 1

样例1输出

5

样例1解释

样例2输入

4 30 2
6 1
5 1
6 2
7 1

样例2输出

2

样例2解释

数据范围

题解

总耗时取决于耗时最长的区域,所以如果耗时最长的区域不止一个,要缩短总耗时,每次应该把所有耗时最长的时间都缩短,当剩余资源无法投入给所有最长耗时的区域时,总耗时就无法缩短了

考虑按耗时从大到小对区域排序,每次将当前耗时最长的i个区域时间缩短到耗时第二长,如果缩短后资源还有剩,此时原来的第二长耗时变成了当前最长耗时,加入当前耗时最长的新区域进行下一轮缩短;如果当前资源不够把所有最长耗时区域缩短到第二长,就全部缩短到资源能满足的最大耗时,然后结束循环

由于每个区域最低耗时不能低于k,排序后将第n+1个区域的耗时设为k,作为循环的终止条件

 

 

 1 #include <algorithm>
 2 #include <cstdio>
 3 using namespace std;
 4 int n,m,k,s;
 5 struct node{
 6     int t,c;
 7 }a[100005];
 8 bool cmp(node x,node y)
 9 {
10     return x.t>y.t;
11 }
12 int main()
13 {
14     int i,j,x=0,y;
15     scanf("%d%d%d",&n,&m,&k);
16     for (i=1;i<=n;i++)
17       scanf("%d%d",&a[i].t,&a[i].c);
18     std::sort(a+1,a+n+1,cmp);
19     a[n+1].t=k;
20     s=a[1].t;
21     for (i=1;i<=n;i++)
22     {
23         x+=a[i].c;
24         while (i<n && a[i+1].t==s)
25           x+=a[++i].c;
26         if (m<x) break;
27         y=s-a[i+1].t;
28         if (m>=x*y)
29         {
30             m-=x*y;
31             s=a[i+1].t;
32         }
33         else
34         {
35             s-=m/x;
36             break;
37         }
38     }
39     printf("%d",s);
40     return 0;
41 }

 

 

posted @ 2023-03-23 17:53  SAKURA12  阅读(588)  评论(0编辑  收藏  举报