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垦田计划的主要内容,如果未能解决你的问题,请参考以下文章

CCF CSP 202212-2 训练计划(C++)

csp模拟赛4旅行计划 (travelling.cpp)--欧拉回路

CSP-S 2019提高组训练 服务器需求

大二上寒假充电计划

2021年C++暑期基础班报名开启!

CCF-CSP 202203 赛题训练