弘文了

P1064 [NOIP2006 提高组] 金明的预算方案

LY00000 @ 2024-11-04 20:47:15

Subtask 0 太水了 我的算法(略有复杂)甚至没有实现排序竟然都过了。。。

一个Subtask调了老子快一个小时,直接就弘文了

原代码:

#include <bits/stdc++.h>
#define F(i,l,r) for(int i=(l);i<=(r);i++)
#define FF(i,r,l) for(int i=(r);i>=(l);i--)
#define ll long long
#define M 3205
using namespace std;

int n,m;
int pos[M];
int v[M][4];
int w[M][4];
int dp[M][4];
bool b[M];
struct node{
    int u,v,w;
    bool operator<(const node &x)const{
        return w<x.w;
    }
}a[M];
int main(){
    ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
    cin>>n>>m;n/=10;
    F(i,1,m){
        cin>>a[i].u>>a[i].v>>a[i].w;
    }
    F(i,1,m){
        int x=a[i].u,y=a[i].v,z=a[i].w;
        x/=10;if(z==0){v[i][0]=x*y;w[i][0]=x;b[i]=1;}
        else{
            v[z][++pos[z]]=v[z][0]+x*y;w[z][pos[z]]=w[z][0]+x;
            if(pos[z]==2){v[z][3]=v[z][1]+v[z][2]-v[z][0];w[z][3]=w[z][1]+w[z][2]-w[z][0];pos[z]++;}
        }
    }
    F(i,1,m){
        if(!b[i])continue;
        FF(j,n,0){
            for(int k=0;k<=pos[i]&&w[i][k]<=j;k++){
//                if(!dp[j-w[i][k]][0]&&w[i][k]!=j)continue;
                dp[j][k]=max(dp[j][0],dp[j-w[i][k]][0]+v[i][k]);
                dp[j][0]=max(dp[j][0],dp[j][k]);
            }
        }
    }
    cout<<dp[n][0]*10<<'\n';

    return 0;
}

现代码:

#include <bits/stdc++.h>
#define F(i,l,r) for(int i=(l);i<=(r);i++)
#define FF(i,r,l) for(int i=(r);i>=(l);i--)
#define ll long long
#define M 3205
using namespace std;

int n,m;
int pos[M];
int v[M][4];
int w[M][4];
int dp[M][4];
int id[M];
bool b[M];
int ans;
struct node{
    int u,v,w,p;
    bool operator<(const node &x)const{
        return w<x.w;
    }
}a[M];
int main(){
    ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
    cin>>n>>m;n/=10;
    F(i,1,m){
        cin>>a[i].u>>a[i].v>>a[i].w;a[i].p=i;
    }sort(a+1,a+1+m);
    F(i,1,m){
        int x=a[i].u,y=a[i].v,z=a[i].w;id[a[i].p]=i;
 //       cout<<x<<' '<<y<<' '<<z<<'\n';
        x/=10;if(z==0){v[i][0]=x*y;w[i][0]=x;b[i]=1;}
        else{
            z=id[z];
            v[z][++pos[z]]=v[z][0]+x*y;w[z][pos[z]]=w[z][0]+x;
            if(pos[z]==2){v[z][3]=v[z][1]+v[z][2]-v[z][0];w[z][3]=w[z][1]+w[z][2]-w[z][0];pos[z]++;}
        }
    }
    F(i,1,m){
        if(!b[i])continue;
        FF(j,n,0){
            for(int k=0;k<=pos[i];k++){
 //               if(!dp[j-w[i][k]][0]&&w[i][k]!=j)continue;
 //               cout<<v[i][k]<<' '<<w[i][k]<<"\n\n";
                if(w[i][k]>j)continue;
                dp[j][k]=max(dp[j][0],dp[j-w[i][k]][0]+v[i][k]);
                dp[j][0]=max(dp[j][0],dp[j][k]);
            }
        }
    }
    // cout<<'\n';F(i,1,n){
    //     dp[n][0]=max(dp[n][0],dp[i][0]);
    //     cout<<dp[i][0]<<'\n';
    // }cout<<'\n';
    cout<<dp[n][0]*10<<'\n';

    return 0;
}

这么个致命错误都没卡掉

优秀的CCF数据


|