poj 1201 Intervals 夜

http://poj.org/problem?id=1201

第一次做差分约束 看了别人的解析 挺详细的

出自http://user.qzone.qq.com/289065406/blog/1307063918

然后自己根据自己的理解 写了代码 建议去看上面链接处的解析 非常不错

#include<iostream>
#include<cmath>
#include<string>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdio>

using namespace std;

const int N=50005;
int ans[N];
struct node
{
    int l,r,k;
}mem[N];
int main()
{
   int n;
   while(scanf("%d",&n)!=EOF)
   {
      int M=0;
      for(int i=0;i<n;++i)
      {
          scanf("%d %d %d",&mem[i].l,&mem[i].r,&mem[i].k);
          --mem[i].l;
          M=max(M,mem[i].r);
      }
      memset(ans,0,sizeof(ans));
      bool OK=false;
      while(!OK)
      {
          OK=true;
          for(int i=0;i<n;++i)
          {
              if(mem[i].l<0)
              {
                  if(mem[i].k>ans[mem[i].r])
                  {OK=false;ans[mem[i].r]=mem[i].k;}
              }
              else
              {
                  if(ans[mem[i].l]+mem[i].k>ans[mem[i].r])
                  {OK=false;ans[mem[i].r]=ans[mem[i].l]+mem[i].k;}
              }
          }
          for(int i=0;i<M;++i)
          {
              if(ans[i+1]<ans[i])
              {OK=false;ans[i+1]=ans[i];}
          }
          for(int i=M;i>0;--i)
          {
              if(ans[i-1]<ans[i]-1)
              {OK=false;ans[i-1]=ans[i]-1;}
          }

      }
      printf("%d\n",ans[M]);
   }
    return 0;
}
原文地址:https://www.cnblogs.com/liulangye/p/2510713.html