1661Help Jimmy

超时了啊,看了人家的正确代码,思路差不多,但是我觉得他错了,可就是ACCEPT了

我的代码

#include  "iostream"
#include "algorithm"
#define INF 100000
using namespace std;
struct node{
  int l,r,h;
}num[1010];
struct{
  int l,r;
}dp[1010];
bool cmp(node a,node b){return a.h>b.h;}
int ab(int a){return a>0?a:(-a);}
int min(int a,int b){return a>b?b:a;}
bool check(int a,int b){
  if(num[b].l<=a&&a<=num[b].r)
     return 1;
  else return 0;
}
int main(){
 int ncase,n,x,h,MAX,i,j,MIN,flag1,flag2,k;
 cin>>ncase;
 while(ncase--){
   MIN=INF;
   cin>>n>>x>>h>>MAX;
   for(i=1;i<=n;i++){
     cin>>num[i].l>>num[i].r>>num[i].h;
   }
   sort(num+1,num+n+1,cmp);
   num[0].l=num[0].r=x;num[0].h=h;
   dp[0].l=0,dp[0].r=0;
   for(i=1;i<=n;i++){
     dp[i].l=INF;dp[i].r=INF;flag1=1;flag2=1;
     for(j=0;j<i;j++){
       int flagl=1,flagr=1;
       for(k=j+1;k<i;k++){
         if(check(num[j].l,k)){flagl=0;}
         if(check(num[j].r,k)){flagr=0;}
       }
       if(flagl&&num[j].h-num[i].h<=MAX&&check(num[j].l,i)){
           dp[i].l=min(dp[i].l,dp[j].l+ab(num[i].l-num[j].l)+num[j].h-num[i].h);
           dp[i].r=min(dp[i].r,dp[j].l+ab(num[i].r-num[j].l)+num[j].h-num[i].h);
       }
       if(flagr&&num[j].h-num[i].h<=MAX&&check(num[j].r,i)){
           dp[i].l=min(dp[i].l,dp[j].r+ab(num[i].l-num[j].r)+num[j].h-num[i].h);
           dp[i].r=min(dp[i].r,dp[j].r+ab(num[i].r-num[j].r)+num[j].h-num[i].h);
       }
    }
   }
   for(i=0;i<=n;i++){
     int flagl=1,flagr=1;
     for(j=i+1;j<=n;j++){
       if(check(num[i].l,j))flagl=0;
       if(check(num[i].r,j))flagr=0;
     }
     if(flagl&&num[i].h<MAX)MIN=min(MIN,dp[i].l+num[i].h);
     if(flagr&&num[i].h<MAX)MIN=min(MIN,dp[i].r+num[i].h);
   }
   cout<<MIN<<endl;
 }
}

人家的代码

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
const int N=1010;
const int inf=1<<30;

typedef struct In{
    int l,r,h;
}In;
In a[N];
int dp[N][2];

int cmp(In a,In b){
    return a.h>b.h;
}

int main(){
    
//    freopen("data.in","r",stdin);
//    freopen("data.out","w",stdout);
    
    int t,N,Y,X,MAX;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d%d",&N,&X,&Y,&MAX);
        a[0].l=a[0].r=X;
        a[0].h=Y;
        for(int i=1;i<=N;i++)
            scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].h);
        sort(a+1,a+N+1,cmp);
        memset(dp,0x0f0f0f0f,sizeof(dp));
        dp[0][0]=dp[0][1]=0;
        for(int i=0;i<=N;i++){
            for(int j=i+1;j<=N;j++){
                if(a[i].h-a[j].h<=MAX){
                    if(a[j].l<=a[i].l&&a[j].r>=a[i].l){
                        dp[j][0]=min(dp[j][0],dp[i][0]+a[i].l-a[j].l+a[i].h-a[j].h);
                        dp[j][1]=min(dp[j][1],dp[i][0]+a[j].r-a[i].l+a[i].h-a[j].h);
                        break;
                    }
                }
            }
            for(int j=i+1;j<=N;j++){
                if(a[i].h-a[j].h<=MAX){
                    if(a[j].l<=a[i].r&&a[j].r>=a[i].r){
                        dp[j][0]=min(dp[j][0],dp[i][1]+a[i].r-a[j].l+a[i].h-a[j].h);
                        dp[j][1]=min(dp[j][1],dp[i][1]+a[j].r-a[i].r+a[i].h-a[j].h);
                        break;
                    }
                }
            }
        }
        int MIN=inf;
        for(int i=N;i>=0;i--){
            if(a[i].h>MAX) break;
            bool flag=false;
            for(int j=i+1;j<=N;j++){
                if(a[j].l<=a[i].l&&a[j].r>=a[i].l){
                    flag=true;
                    break;
                }
            } 
            if(!flag) MIN=min(MIN,dp[i][0]+a[i].h);
            flag=false;
            for(int j=i+1;j<=N;j++){
                if(a[j].l<=a[i].r&&a[j].r>=a[i].r){
                    flag=true;
                    break;
                }
            } 
            if(!flag) MIN=min(MIN,dp[i][1]+a[i].h);
        }
        printf("%d
",MIN);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/dowson/p/3319702.html