80pts TLE,求助
查看原帖
80pts TLE,求助
547908
NightTide楼主2021/8/26 15:28

80pts TLE,求助大佬这种方法能不能优化。

#include<bits/stdc++.h>
#define MAXN 10010
#define MAXM 1010
#define INF 1000000000
using namespace std;
struct guandao{
    int pos,up_line,down_line;
};
guandao gu[MAXN];
int n,m,k;
int up[MAXN],down[MAXN];
int f[MAXM][MAXN];
int book[MAXN],vis[MAXN];
int main(){
    // freopen("bird.in","r",stdin);
    // freopen("bird.out","w",stdout);
    scanf("%d%d%d",&n,&m,&k);
    for(int i=0;i<n;i++){
        scanf("%d%d",&up[i],&down[i]);
    }
    for(int i=1;i<=k;i++){
        scanf("%d%d%d",&gu[i].pos,&gu[i].down_line,&gu[i].up_line);
        book[gu[i].pos]=i;
    }
    memset(f,0x3f,sizeof(f));
    for(int i=0;i<m;i++){
        f[i][0]=0;
    }
    for(int i=0;i<n;i++){
        // cout<<"--------------------"<<endl;
        for(int j=0;j<m;j++){
            // cout<<f[j][i]<<endl;
            if(f[j][i]<INF){
                vis[i]=true;
                // cout<<"*"<<endl;
                for(int s=1;s<=j/up[i];s++){
                    // printf("(%d,%d)->(%d,%d) %d->%d\n",j,i,j-s*up[i],i+1,f[j-s*up[i]][i+1],min(f[j-s*up[i]][i+1],f[j][i]+s));
                    // cout<<f[j-s*up[i]][i+1]<<endl;
                    f[j-s*up[i]][i+1]=min(f[j-s*up[i]][i+1],f[j][i]+s);
                    // cout<<f[j-s*up[i]][i+1]<<endl;
                }
                // cout<<j<<" "<<up[i]<<endl;
                if(j%up[i]||j==0){
                    // printf("(%d,%d)->(%d,%d) %d->%d\n",j,i,0,i+1,f[0][i+1],min(f[0][i+1],f[j][i]+j/up[i]+1));
                    f[0][i+1]=min(f[0][i+1],f[j][i]+j/up[i]+1);
                    // cout<<f[0][i+1]<<endl;
                }
                if(j+down[i]<m){
                    // printf("(%d,%d)->(%d,%d) %d->%d\n",j,i,j+down[i],i+1,f[j+down[i]][i+1],min(f[j+down[i]][i+1],f[j][i]));
                    f[j+down[i]][i+1]=min(f[j+down[i]][i+1],f[j][i]);
                    // printf("%d\n",f[j+down[i]][i+1]);
                }
                // cout<<book[i+1]<<endl;;
            }
        }
        if(book[i+1]){
            // cout<<i<<endl;
            for(int u=0;u<=m-gu[book[i+1]].up_line;u++){
                f[u][i+1]=INF+10;
                // cout<<u<<endl;
            }
            // cout<<endl;
            for(int d=m;d>=m-gu[book[i+1]].down_line;d--){
                f[d][i+1]=INF+10;
                // cout<<d<<endl;
            }
        }
        // for(int i=0;i<=m;i++){
        //     for(int j=0;j<=n;j++){
        //         if(f[i][j]<INF)
        //             printf("%-4d",f[i][j]);
        //         else
        //             cout<<"*"<<"   ";
        //     }
        //     cout<<endl;
        // }
    }
    int ans=INF;
    for(int i=0;i<=m;i++){
        ans=min(ans,f[i][n]);
    }
    if(ans<INF){
        printf("1\n%d\n",ans);
    }else{
        ans=0;
        for(int i=0;i<n;i++){
            if(book[i]&&vis[i]){
                ans++;
            }else if(!vis[i]){
                break;
            }
        }
        printf("0\n%d\n",ans);
    }
    return 0;
}
/*
10 10 6
3 9
9 9
1 2
1 3
1 2
1 1
2 1
2 1
1 6
2 2
1 2 7
5 1 5
6 3 5
7 5 8
8 7 9
9 1 3
*/
/*
10 10 4
1 2
3 1
2 2
1 8
1 8
3 2
2 1
2 1
2 2
1 2
1 0 2
6 7 9
9 1 4
3 8 10
*/
2021/8/26 15:28
加载中...