EPIC Institute of Technology Round Summer 2024 (Div. 1 + Div. 2) D.World is Mine

EPIC Institute of Technology Round Summer 2024 (Div. 1 + Div. 2) D.World is Mine

  • dp[i][j] 的定义是前 i i i 种物品中 Bob 取 j j j 种物品所需的步骤
  • i - j 为Alice操作次数 dp[i-1][j-1]+w[i-1] 为Bob操作次数 Alice操作次数应比Bob多,所以会有此dp条件
void solve() 
    //code here
    int n;
    cin >> n;
    vector<int>arr(n + 1);
    for(int i = 0;i < n;++i){
        int tmp;cin >> tmp;
        ++arr[tmp];
    }

    vector<int>w;
    for(int i = 0;i <= n;++i)
        if(arr[i])w.push_back(arr[i]);

    n = w.size();
    vector<vector<int>>dp(2,vector<int>(n + 1,INT_MAX));    //dp[i][j] 前i种物品中bob取j种物品所需的步骤
                                                            //取INT_MAX是为了后面取min时好区分
    dp[0][0] = dp[1][0] = 0;

    for(int i = 1;i <= n;++i){	
        int I = i % 2;										//因为数组太大会MLE,我们要开滚动
        int I_1 = I ^ 1;
        for(int j = 1;j <= i;++j){
            dp[I][j] = dp[I_1][j];
            if(dp[I_1][j - 1] + w[i - 1] <= i - j)              //i - j为Alice操作次数 dp[i-1][j-1]+w[i-1]为Bob操作次数 Alice操作次数应比Bob多
                dp[I][j] = min(dp[I_1][j],dp[I_1][j - 1] + w[i - 1]);		//取到j个时步数用的越少越好,为了使后面更好的能被选
        }
    }

    for(int i = n;i >= 0;--i)
        if(dp[n % 2][i] != INT_MAX){cout << n - i << endl;return;}
    
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值