山东财经大学新生赛暨天梯赛选拔赛 D.流星雨(动态规划)

题目链接

题目描述

英仙座流星雨(学名Perseids)是以英仙座γ星附近为辐射点出现的流星雨,也称英仙座γ流星雨。每年在7月20日至8月20日前后出现,于8月13日达到高潮。与象限仪座流星雨、双子座流星雨并称为北半球三大流星雨。

暑假到了,又是一个去看流星雨的好季节。
看流星雨最重要的是什么?当然是许愿。
当一颗流星出现时,可以对其许愿。

你一次可以选择一颗流星进行许愿,每一个愿望都需要一定的时间才能说完,而且中间不能有中断。
但是流星的持续时间通常都很短,很难在流星消失之前把自己的一个愿望说完。
你可以朝着新出现的流星接着许上一个未许完的愿望,当且仅当前一颗流星消失的瞬间另外一颗流星同时出现,
你不可以在一颗流星还在出现的时候转向其他的流星,这样流星之神会生气,厄运会降临
现在给你每颗流星出现和结束的时间,问你许一个愿望的最大时长是多少?

输入描述

第一行一个数 n n n n ≤ 1000000 n\leq1000000 n1000000

表示流星的数目

接下来每行2个数字 x , y x,y xy ( 0 &lt; x , y ≤ 1000000 ) (0&lt;x,y\leq1000000) 0<x,y1000000

表示流星出现的时间和结束的时间

输出描述

一个数字,表示最长可以连续许愿的时间

示例1

输入
3
2 3
2 4
1 2
输出
3
说明
1~4
题目大意

给你 n n n个时间片段,在其中选 k k k个,组合出能表示的最大范围,其中在连接处必须相等。

解题思路

因为对于每一个时间点,有开始时间和结束时间,所以自然而然的就想到要用结构体来存,同时这种题已经是一种经典问题了,拿到这种题输入结束之后就是对结构体数组进行一个排序,排序之后就是用动态规划的思想。用一个数组去维护以 a a a为结尾节点的最长时间长度,对于每一个节点 b b b不断的去更新, d p [ b ] = m a x ( d p [ b ] , d p [ a ] + y − x ) dp[b]=max(dp[b],dp[a]+y-x) dp[b]=max(dp[b],dp[a]+yx)。在这同时用 r e s res res存所有的最大值便可。

AC代码
#include <bits/stdc++.h>
#define INF 0x3f3f3f
using namespace std;
const int mod=1e8+7;
const int Max_N=1e6+500;
typedef pair<int,int>P;
typedef long long ll;
typedef unsigned long long ull;
struct Num
{
    int x,y;
};
Num num[Max_N];
bool cmp(Num a,Num b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}
int dp[Max_N],sum[Max_N];
int main(int argc, char const *argv[])
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>num[i].x>>num[i].y;
    }
    sort(num,num+n,cmp);
    sum[num[0].y]=num[0].y-num[0].x;
    int res=0;
    for(int i=1;i<n;i++)
    {
        int a=num[i].x;
        int b=num[i].y;
        int mid=sum[a]+b-a;
        res=max(res,mid);
        sum[b]=max(sum[b],mid);
    }
    cout<<res<<endl;
    return 0;
}
总结

题目给出的n的最大值为 1 e 6 1e6 1e6,刚开始数组开到 1 e 6 + 5 1e6+5 1e6+5,出现了段错误,最后把数组开的更大才过,汲取经验,下次尽量把数组开大 20 20 20左右。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值