首页 > 其他分享 >Codeforces Round 889 (Div. 1) B. Earn or Unlock(dp,bitset)

Codeforces Round 889 (Div. 1) B. Earn or Unlock(dp,bitset)

时间:2023-08-27 19:55:28浏览次数:40  
标签:std Earn 卡片 解锁 张卡牌 Codeforces 卡牌 889 dp

题目链接:https://codeforces.com/problemset/problem/1854/B

 

题目大致题意:

 

有n张卡牌从上到下堆叠,每张卡片有锁或不锁俩种状态,一开始第一张是不锁的;

对最上面的卡牌,如果他是不锁的状态,那么可以进行俩种操作:

1:从上到下,将v张被锁的卡牌解锁;

2:获取v点能量

现在求能获得的最大的能量是多少?

 

解题思路:

 

一开始,我们可以观察到,解锁的卡牌一定是从上到下是连续,所以对于最终结果,一定是前a张卡牌被解锁的状态,后面的卡牌都是锁的状态;

 

那么我们可以知道,假设前k张卡牌被解锁,那么最终的结果是Σ ai - k + 1;

 

感性理解:如果将一张权值为 x 的卡片用来解锁接下来的 x 张卡片,那么相比于用它换取 x 分,就相当于损失了 x 分。因此,我们解锁了 k−1 张卡片(不包括 1 号卡片),就要损失 k−1 分。

 

所以我们需要考虑是否存在k张卡牌解锁的情况;

 

那么这就是比较典 的问题了,用bitset来加速即可;

 

时间复杂度:O(n^2/w);

 

代码:

#include<bits/stdc++.h>

const int N = 2e5 + 5;
std::bitset<N> dp;
long long sum;

signed main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0); std::cout.tie(0);

    int n; std::cin >> n;
    dp[1] = 1; sum = 0;

    long long ans = 0;

    for (int i = 1; i <= n; ++i)
    {
        int x = 0;
        std::cin >> x;
        dp |= (dp << x);
        sum += x;
        if (dp[i])ans = std::max(ans, sum - i + 1), dp[i] = 0;
    }

    for (int i = n + 1; i <= 2 * n; ++i)
        if (dp[i])ans = std::max(ans, sum - i + 1);

    std::cout << ans << "\n";

    return 0;
}

当然,还是需要靠一点点小小的细节的,读者可以通过代码思考一下:)

标签:std,Earn,卡片,解锁,张卡牌,Codeforces,卡牌,889,dp
From: https://www.cnblogs.com/ACMER-XiCen/p/17658496.html

相关文章

  • Codeforces Round 890 (Div. 2) supported by Constructor Institute D. More Wrong(交
    题目链接:https://codeforces.com/contest/1856/problem/D 大致题意:这是一道交互题,有1~n的排列p,对于每次询问,你可以花费(R-L)2的代价去得到区间【L,R】之内的逆序对的个数,你需要在5n2的代价内得到n的位置。 初步思路: 首先我们来思路,在什么时候,我们可以确定那个位置是n。假......
  • 神经网络——基于sklearn的参数介绍及应用
    一、MLPClassifier&MLPRegressor参数和方法参数说明(分类和回归参数一致):hidden_layer_sizes:例如hidden_layer_sizes=(50,50),表示有两层隐藏层,第一层隐藏层有50个神经元,第二层也有50个神经元。activation:激活函数,{‘identity’,‘logistic’,‘tanh’,‘relu’},默认rel......
  • 机器学习 -> Machine Learning (I)
    1机器学习概述1.1定义及应用领域机器学习是一种让计算机通过经验学习并对输入数据做出决策或预测的方法.它是人工智能的一个重要分支,已广泛应用于各种领域,如自然语言处理,计算机视觉,推荐系统,医疗诊断,金融风险预测等.1.2机器学习与人工智能,深度学习的关系人......
  • Codeforces Round 894 (Div. 3)
    A.\(n\)个长为\(m\)的字符串,判断存在\(i,j,k,l\)有\(1\leqi<j<k<l\leqm\),满足这四列的字符串分别有\(v,i,k,a\)。小细节的题。时间复杂度\(O(n^2)\)。view#include<bits/stdc++.h>#defineREP(i,A,N)for(inti=(int)A;i<=(int)N;i+......
  • 【CFVP】Codeforces Round 851 (Div. 2)
    前言本场VP深感自己的弱小与史队的强大。又一次被史队全方位暴打。来做一个简要的总结。正文A.OneandTwoA题日常的愚蠢。考虑到原序列只含有质因子2。我们将质因子2平分给左右两边即可。当2的个数为奇数时即判断为无解。代码:#include<bits/stdc++.h>usingnamespace......
  • Codeforces Round 894 (Div. 3) ABCDEFG AK
    CodeforcesRound894(Div.3)第一次div3ak,虽然是vp的,后三题质量不错A-GiftCarpet穷举四个不同列即可,时间复杂度\(O(M^4)\)inta[100][100];voidsolve(){memset(a,0,sizeofa);intn,m;cin>>n>>m;for(inti=1;i<=n;i++)......
  • CodeForces 825G Tree Queries
    洛谷传送门CF传送门模拟赛赛时做法。看到查询路径点权最小值,想到建重构树,满足重构树上\(\operatorname{LCA}(x,y)\)为原树上\(x\toy\)路径的点权最小值。建树方法可以参考CF1797FLiHuaandPath。于是问题变成了,维护一个点集,支持加点,查询给定点\(x\)到点集中所有......
  • Codeforces Round 894 (Div. 3)
    CodeforcesRound894(Div.3)因为最近开学了,所以晚上可能就没有什么时间打这个了,不过以后一定会在第二天把题给补掉A题传送门A题意:就是在一个n*m的的字符矩阵中从左往右依次取出4列,使得每列包含vika这四个字符中按顺序出现一个。必须保证是按顺序出现。A思路:这是一个简......
  • Codeforces Round 894 (Div. 3) A-F题解
    A.GiftCarpet题意最近,特马和维卡庆祝了家庭日。他们的朋友Arina送给他们一块地毯,这块地毯可以用拉丁文小写字母的\(n\cdotm\)表来表示。维卡还没看过礼物,但特马知道她喜欢什么样的地毯。如果维卡能在地毯上读出自己的名字,她一定会喜欢的。她从左到右逐列阅读,并从当前列中......
  • Learn Git in 30 days——第 06 天:解析 Git 资料结构 - 物件结构
    写的非常好的一个Git系列文章,强烈推荐原文链接:https://github.com/doggy8088/Learn-Git-in-30-days/tree/master/zh-cn在Git的资料结构中,「物件」是一种「不可变的」(immutable)文件类型,所有储存在「物件储存区」的文件通常只进不出,也不会被修改内容。原因在于,如果你窜改......