萌新刚学 OI,求条 E 题!
  • 板块灌水区
  • 楼主da_ke
  • 当前回复14
  • 已保存回复14
  • 发布时间2024/10/12 21:43
  • 上次更新2024/10/13 00:52:49
查看原帖
萌新刚学 OI,求条 E 题!
766675
da_ke楼主2024/10/12 21:43
#include <bits/stdc++.h>

#define i64 long long
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define fdn(i,r,l) for(int i=(r);i>=(l);i--)
#define pii pair<int,int>
using namespace std;

typedef long long ll;
typedef double db;
typedef __int128 i128;

std::mt19937 rnd(std::chrono::steady_clock::now().time_since_epoch().count());
std::mt19937_64 rnd64(std::chrono::steady_clock::now().time_since_epoch().count());

const int N=102;
const int M=1501;

int n;
int mem[N][M][M];
vector<int> A,B;

int dp(int i,int a,int b,int c)
{
    if(a<0||b<0||c<0) return N;
    int& ans=mem[i][a][b];
    if(i==n+1)
    {
        if(a==0&&b==0&&c==0) return 0;
        else return N;
    }
    if(ans!=-1) return ans;
    ans=N;
    // 决策1:不换。
    if(A[i]==1) ans=min(ans,dp(i+1,a-B[i],b,c));
    else if(A[i]==2) ans=min(ans,dp(i+1,a,b-B[i],c));
    else if(A[i]==3) ans=min(ans,dp(i+1,a,b,c-B[i]));
    // 决策2:换。
    if(A[i]==1) ans=min(ans,1+min(dp(i+1,a,b-B[i],c),dp(i+1,a,b,c-B[i])));
    else if(A[i]==2) ans=min(ans,1+min(dp(i+1,a-B[i],b,c),dp(i+1,a,b,c-B[i])));
    else if(A[i]==3) ans=min(ans,1+min(dp(i+1,a-B[i],b,c),dp(i+1,a,b-B[i],c)));
    return ans;
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    cin>>n;
    A.resize(n+1),B.resize(n+1);
    int sum=0;
    rep(i,1,n) cin>>A[i]>>B[i],sum+=B[i];
    int u=sum/3+1,ans=N;
    memset(mem,-1,sizeof(mem));
    fdn(i,u,0) ans=min(ans,dp(1,i,i,i));
    cout<<(ans>=N?-1:ans);
}

信心满满,认为是对的,但是交上去破防了。

2024/10/12 21:43
加载中...