PKU 2313

http://d.hatena.ne.jp/shinichiro_h/20060717#1153074365
元のアルゴリズム

n,a,b,c,r,s,t;
main()
{
  scanf("%*d%d",&a);
  b=a;
  for(;~scanf("%d",&c);)
    {
      t=b-c;
      r+=abs(t);
      if(s*t<0)
        {
          if(abs(s)<abs(t))
            {
              r-=abs(s);
              b=a;
              t=b-c;
            }
          else
            {
              r-=abs(t);
              b=c;
              t=0;
            }
        }
      s=t;a=b;b=c;
    }
  printf("%d\n",r);
}

こんなんです。
基本的には一緒ですね。

あとは、上のほうが新しくて

//a,c,r,S,T,n;main(b){for(;~scanf("%d",&c);n++<2?a=c:(r+=T=abs(b-c),a>b^b<c?a=b:(r-=S<T?S:(a=c,T)),S=abs(a-c)),b=c);printf("%d",r);}
//a,c,r,S,T;main(b){scanf("%*d%d",&a);for(b=a;~scanf("%d",&c);r+=T=abs(b-c),a>b^b<c?a=b:(r-=S<T?S:(a=c,T)),S=abs(a-c),b=c);printf("%d",r);}
//a,c,r,S,T;main(b){scanf("%*d%d",&a);for(b=a;~scanf("%d",&c);T=abs(b-c),a=a>b==b>c?(r+=T,b):S<T?(r+=T-S,0):c,S=abs(a-c),b=c);printf("%d",r);}
//a,c,r,S,T;main(b){scanf("%*d%d",&a);for(b=a;~scanf("%d",&c);r+=T=abs(b-c),a>b!=b>c?(r-=S<T?S:(a=c,T)):(a=b),S=abs(a-c),b=c);printf("%d",r);}
//a,c,r,S,T;main(b){scanf("%*d%d",&a);for(b=a;~scanf("%d",&c);r+=T=abs(b-c),a>b==b>c?a=b:(r-=S<T?S:(a=c,T)),S=abs(a-c),b=c);printf("%d",r);}
//a,c,r,S,T;main(b){scanf("%*d%d",&a);for(b=a;~scanf("%d",&c);r+=T=abs(b-c),(a-b)*(b-c)>0?a=b:(r-=S<T?S:(a=c,T)),S=abs(a-c),b=c);printf("%d",r);}
//a,b,c,r,s,S,T;main(){scanf("%*d%d",&a);for(b=a;~scanf("%d",&c);r+=T=abs(b-c),s*b>s*c?a=b:(r-=S<T?S:(a=c,T)),S=abs(s=a-c),b=c);printf("%d",r);}
//a,b,c,r,s,S,T;main(){scanf("%*d%d",&a);for(b=a;~scanf("%d",&c);r+=T=abs(b-c),s*b>s*c?a=b:(r-=S<T?S:T,S<T?:a=c),S=abs(s=a-c),b=c);printf("%d",r);}
//a,b,c,r,s,S,T;main(){scanf("%*d%d",&a);for(b=a;~scanf("%d",&c);){r+=T=abs(b-c);s*b>s*c?:(r-=S<T?(b=a,S):(b=c,T));S=abs(s=b-c);a=b;b=c;}printf("%d",r);}
//n,a,b,c,r,s,t,S,T;main(){scanf("%*d%d",&a);for(b=a;~scanf("%d",&c);s=b-c,a=b,b=c){t=b-c;r+=T=abs(t);S=abs(s);if(s*t<0)r-=(S<T?(b=a,S):(b=c,T));}printf("%d",r);}
//n,a,b,c,r,s,t,S,T;main(){scanf("%*d%d",&a);for(b=a;~scanf("%d",&c);){t=b-c;r+=T=abs(t);S=abs(s);if(s*t<0)r-=(S<T?(b=a,S):(b=c,T));s=b-c;a=b;b=c;}printf("%d",r);}
//n,a,b,c,r,s,t;main(){scanf("%*d%d",&a);b=a;for(;~scanf("%d",&c);){t=b-c;r+=abs(t);if(s*t<0){if(abs(s)<abs(t)){r-=abs(s);b=a;t=b-c;}else{r-=abs(t);b=c;t=0;}}s=t;a=b;b=c;}printf("%d\n",r);}

変数を減らすときにローカルミニマムにはまってしまったのが困った感じですね。