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;

}

 

 

你可能感兴趣的:(poj)