【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 }