csp202303-2垦田计划
Posted SAKURA12
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,作为循环的终止条件
#include <algorithm> #include <cstdio> using namespace std; int n,m,k,s; struct node int t,c; a[100005]; bool cmp(node x,node y) return x.t>y.t; int main() int i,j,x=0,y; scanf("%d%d%d",&n,&m,&k); for (i=1;i<=n;i++) scanf("%d%d",&a[i].t,&a[i].c); std::sort(a+1,a+n+1,cmp); a[n+1].t=k; s=a[1].t; for (i=1;i<=n;i++) x+=a[i].c; while (i<n && a[i+1].t==s) x+=a[++i].c; if (m<x) break; y=s-a[i+1].t; if (m>=x*y) m-=x*y; s=a[i+1].t; else s-=m/x; break; printf("%d",s); return 0;
以上是关于csp202303-2垦田计划的主要内容,如果未能解决你的问题,请参考以下文章