列表

详情


NC23647. 流星雨

描述

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

 

暑假到了,又是一个去看流星雨的好季节。

看流星雨最重要的是什么?当然是许愿。

当一颗流星出现时,可以对其许愿。

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

现在给你每颗流星出现和结束的时间,问你许一个愿望的最大时长是多少?

输入描述

第一行一个数n n<=1000000

表示流星的数目

接下来每行2个数字 x,y (0<=x,y<=1001000 )

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

输出描述

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

示例1

输入:

3
2 3
2 4
1 2

输出:

3

说明:

1~4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 833ms, 内存消耗: 13520K, 提交时间: 2019-04-11 21:07:58

#include<bits/stdc++.h>
using namespace std;
int n,dp[1001005],ans;
struct node
{
    int l,r;
    bool operator <(const node&m)const
    {
        return l<m.l;
    }
}k[1001005];
int main()
{
    cin>>n;
for(int i=1;i<=n;i++)
{
    cin>>k[i].l>>k[i].r;
}
sort(k+1,k+1+n);
for(int i=1;i<=n;i++)
{
    dp[k[i].r]=max(dp[k[i].r],dp[k[i].l]+k[i].r-k[i].l);
    ans=max(ans,dp[k[i].r]);
}
cout<<ans;
    return 0;
}

C++ 解法, 执行用时: 837ms, 内存消耗: 12152K, 提交时间: 2022-02-17 16:42:52

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+7;
int ans[maxn],sum;

struct node{
	int x,y;
}e[maxn];

bool cmp(node a,node b){
	return a.x<b.x; 
}

int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)cin>>e[i].x>>e[i].y;
	sort(e+1,e+n+1,cmp);
	for(int i=0;i<=n;i++){
		ans[e[i].y]=max(ans[e[i].y],e[i].y-e[i].x+ans[e[i].x]);
		sum=max(sum,ans[e[i].y]);
	}
	cout<<sum;
}

上一题