ssl1212 大厅安排 luogu P2439 [SDOI2005]阶梯教室设备利用

编程入门 行业动态 更新时间:2024-10-23 20:31:31

ssl1212 大厅安排 luogu P2439 [SDOI2005]<a href=https://www.elefans.com/category/jswz/34/1742564.html style=阶梯教室设备利用"/>

ssl1212 大厅安排 luogu P2439 [SDOI2005]阶梯教室设备利用

题目大意

原题
给出n个时间段(开始时间和结束时间),从中选择几个不重合的时间段,使得所有时间段加起来最大。

解题思路

由于时间段不能重合,并且输入不是按顺序排的,所以直接做会导致漏掉需要选择的时间段或选择了不需要选择的时间段,因此要先按结束时间排序。
其次我们再考虑设 f i f_i fi​为前 i i i个时间段能获得的时间,对于一个时间段,如果不选,则时间不会改变,所以不选的值是 f i f_i fi​;如果选,那么就需要枚举它的上一个时间段 j j j,并且第 i i i个时间段的开始时间必须小于或等于第 j j j个时间段的结束时间,否则会导致时间段的重合,因此,我们可以推出
f i = m a x ( f i , f j + t i , 2 − t i , 1 ) f_i=max(f_i,f_j+t_i,_2-t_i,_1) fi​=max(fi​,fj​+ti​,2​−ti​,1​)
注意: j j j的结束时间 ≤ i \le i ≤i的开始时间,并且在dp时要边做边取,因为最后取得的 f n f_n fn​不一定是最优解,而是当选择最后一场的最优解。
初始化: f [ i ] = t i , 2 − t i , 1 f[i]=t_i,_2-t_i,_1 f[i]=ti​,2​−ti​,1​。

代码

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int ans,f[3005],n;
struct ap{int l,r;
}t[1005];
bool cmp(ap a,ap b)
{return a.l<b.l;
}
int main()
{cin>>n;for(int i=1;i<=n;i++)cin>>t[i].l>>t[i].r;sort(t+1,t+n+1,cmp);//按结束时间排序for(int i=1;i<=n;i++)	f[i]=t[i].r-t[i].l;for(int i=1;i<=n;i++)//枚举ifor(int j=1;j<i;j++)//枚举i要在哪一场之后举行if(t[i].l>=t[j].r)//如果时间不重合{f[i]=max(f[i],f[j]+t[i].r-t[i].l);ans=max(ans,f[i]);//边做边取,最后得到的f[n]可能不是正解}cout<<ans;return 0;
}

更多推荐

ssl1212 大厅安排 luogu P2439 [SDOI2005]阶梯教室设备利用

本文发布于:2024-02-12 05:00:02,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1686173.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:阶梯   大厅   教室   设备   luogu

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!