先按结束时间排序,然后对于任务i,在[1,i-1]内二分找出结束时间<=i的开始时间,且尽量小的任务
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int s,t,w;
}x[10000+10];
bool cmp(node i,node j)
{
return i.t<j.t;
}
int B_search(int s,int t,int val)
{
int m,ans;
while(s<=t)
{
m=(s+t)>>1;
if(x[m].t<=val) ans=m,s=m+1;
else t=m-1;
}
return ans;
}
int n;
int dp[10000+10];
int main()
{
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
scanf("%d%d%d",&x[i].s,&x[i].t,&x[i].w);
sort(x+1,x+n+1,cmp);
memset(dp,0,sizeof(dp));
dp[1]=x[1].w;
for(int i=2;i<=n;i++)
{
int t=B_search(1,i-1,x[i].s);
dp[i]=max(dp[i-1],x[i].w+dp[t]);
}
printf("%d\n",dp[n]);
}
return 0;
}