xtu1148 dp

来源:互联网 发布:日程管理app 知乎 编辑:程序博客网 时间:2024/04/27 21:52
#include <stdio.h>#include <algorithm> struct Node{  int s,t,v; }test[100005]; using namespace std; bool cmp(Node a,Node b){  return a.t <= b.t; } __int64 dp[100005]; int max(int a,int b){  return a > b ? a : b; } int find(int i,int n){  int low = 0,max = n,m;  while(1){   if (max - low == 1)        return low;   m = (low + max) / 2;   if (test[i].s >= test[m].t)            low = m;   else        max = m;  }//注意这里不能改成当test[i].s == test[m].t 就返回m,因为这样没有考虑存在很多test[x].t等于test[i].//直接返回并不代表找到了s[i]前最近的t[x],再此处纠结很久,搞死人啊! } int main (){  int n,i;  while(scanf("%d",&n) != EOF){   for(i = 0;i < n;i++){    scanf("%d%d%d",&test[i].s,&test[i].t,&test[i].v);    if (test[i].v <= 0){     i--;     n--;    }   }   sort(test,test + n,cmp);   memset(dp,0,sizeof(dp));   dp[0] = test[0].v;   for(i = 1;i < n;i++){       if(test[i].s < test[0].t) dp[i] = test[i].v > dp[i-1] ? test[i].v : dp[i-1];    else {    int last = find(i,n);    dp[i] = max(dp[i-1],dp[last] + test[i].v);     }   }    printf("%lld\n",dp[n-1]);  }  return 0; }


 

 

原创粉丝点击