• 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;
    }
  • 相关阅读:
    windows下安装pip教程
    python安装扩展”unable to find vcvarsall.bat“的解决办法
    minggw 安装
    Python-- easy_install 的安装
    python 处理中文遇到的编码问题总结 以及 字符str的编码如何判断
    python中的三个读read(),readline()和readlines()
    同时读取两个文件进行while循环
    python 类实例化,修改属性值
    Python if-elif-else
    python 元组
  • 原文地址:https://www.cnblogs.com/dowson/p/3319702.html
Copyright © 2020-2023  润新知