题目
https://www.luogu.org/problemnew/show/P2439
思路
思路就是开30000个vector作为起始时间(就是不用排序),对于读入的东西(st,ed)将ed扔到st的那个vector里,然后就是一个很假的dp了,dp[i]表示在i时间结束的最大演讲时间,转移也很简单,就是要注意下dp[i]的初值是dp[i-1],因为可以某段时间不排演出
代码
#include<bits/stdc++.h>
using namespace std;
int n,dp[30010]={0},st,ed;
vector<int>mp[30010];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&st,&ed),mp[st].push_back(ed);
for(int i=0;i<=30000;i++)
{
if(i>1)dp[i]=max(dp[i],dp[i-1]);
for(int j=0;j<mp[i].size();j++)
dp[mp[i][j]]=max(dp[mp[i][j]],dp[i]+mp[i][j]-i);
}
cout<<dp[30000];
}