超时了啊,看了人家的正确代码,思路差不多,但是我觉得他错了,可就是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; }