题解 P2439 【[SDOI2005]阶梯教室设备利用】
蒟蒻写了个O(n+k)算法,简单粗暴.jpg.思路就是开30000个vector作为起始时间(就是不用排序),对于读入的东西(st,ed)将ed扔到st的那个vector里,然后就是一个很假的dp了,dp[i]表示在i时间结束的最大演讲时间,转移也很简单,就是要注意下dp[i]的初值是dp[i-1],因为可以某段时间不排演出...代码17行,0ms,还算可以...具体看代码吧...
#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];//最大就30000结束
}