首页 > 其他分享 >CF436E - Cardboard Box 题解

CF436E - Cardboard Box 题解

时间:2024-03-14 19:22:48浏览次数:19  
标签:Box cnt 位置 题解 mn 答案 物品 CF436E se

只讲贪心做法。

一、反悔贪心

考虑如何使选的星星总数多一。显然,有如下几种方式:

  • 选一个之前没选过的位置 \(i\),答案加上 \(a_i\)。

  • 选一个之前选过一次的位置 \(i\),答案加上 \(b_i-a_i\)。

  • 对于一个之前选过一次的位置 \(i\),再找到一个没有选过的位置 \(j\),反悔掉 \(i\),并选两次 \(j\),答案加上 \(b_j-a_i\)。

  • 对于一个之前选过两次的位置 \(i\),再找到一个没有选过的位置 \(j\),反悔掉 \(i\) 的第二次选择,并选两次 \(j\),答案加上 \(b_j-(b_i-a_i)=b_j-b_i+a_i\)。

总结一下,我们需要分别维护 \(a_i,b_i,-a_i,a_i-b_i,b_i-a_i\) 的最值,使用五个堆即可。但是每个策略可能会对多个堆进行修改,比较复杂,不推荐。

时间复杂度 \(O(n\log n)\)。

二、直接贪心

考虑每次选两个星星,那么我们需要权衡的是选 \(a_i+a_j\) 还是 \(b_i\)。

定义:\(2\) 物品表示根据以上选择方式,一次用掉 \(b_i\),对答案贡献为 \(2\) 的物品,剩下的都是 \(1\) 物品(如果其 \(b=2\),会分成 \(a\) 和 \(b-a\) 两次选)。

开两个堆,存储 \(1\) 物品和 \(2\) 物品,然后每轮选择进行如下过程:

  • 记录每个数是作为 \(2\) 物品被扔掉还是 \(1\) 物品。然后对于每个堆,把所有不合法的扔掉。

  • 取出 \(1\) 堆的最小值和次小值 \(a_{mn},a_{se}\) 和 \(2\) 堆的最小值 \(b_{mn}\)(若不存在视为 \(+\infty\))。

  • 若 \(a_{mn}+a_{se}\le b_{mn}\):记录下每个数被选的次数,令 \(a_{mn},a_{se}\) 对应的 \(cnt\to cnt+1\),并标记为作为 \(1\) 物品使用。若此时 \(cnt=1\),说明选择的是 \(a\),再将 \(b-a\) 扔进去。然后把 \(b_{mn}\) 扔回去(如果是 \(+\infty\),忽略)。

  • 否则:使用 \(b_{mn}\),设置其 \(cnt=2\),作为 \(2\) 物品被使用。然后将 \(a_{mn},a_{se}\) 塞回去。

这样选择方案就输出 \(cnt\) 即可。

但是这样做有一个问题:如果 \(w\) 是奇数怎么办。此时我们可以加入一个值和编号都为 \(0\) 的 \(1\) 物品进去,并标记 \(cnt=1\),这样它就只会被用一次。

时间复杂度 \(O(n\log n)\)。

Code

标签:Box,cnt,位置,题解,mn,答案,物品,CF436E,se
From: https://www.cnblogs.com/syzqwq/p/18073731

相关文章

  • 洛谷 P3596 [POI2015] MOD 题解
    题意简述给定一棵树,求断掉一条边再连上一条边所得的新树直径最小值和最大值,以及相应方案(你可以不进行任何操作,即断掉并连上同一条边)。题目分析假设我们枚举断掉某一条边,得到了两棵树,并且知道它们的直径分别为\(d_0,d_1\),那么如何连接一条边让新树的直径最大/最小呢?最大:显......
  • 洛谷 P3261 [JLOI2015] 城池攻占 题解
    题目分析其他人要么倍增,要么左偏树,那我就来讲讲朴实无华的dfs序加上线段树的做法。首先发现题目中明确指出了作乘法的时候一定是乘上一个大于零的数,这是为什么呢?首先把可以占领当前城池的战斗力的不等式列出来:\[h_j\le\left\{\begin{array}{c}s_i\timesv_j&&{a_j=......
  • 「PKUSC2022」雀圣 题解
    这边电脑的输入法要把我干烧了。。D2T3出这种模拟题,那简直不要太好。首先,不难想到暴力搜索要摸那些牌,然后丢哪些牌。然后手搓一些\(\texttt{check}\),这个应该都会,但是实际上比正解难写。我不知道\(\texttt{lay}\)打的什么东西,比我快20多倍,但是个人认为我这个思路挺暴力的。......
  • P1829 / SP8099 Crash的数字表格 题解
    P1829/SP8099Crash的数字表格题解莫比乌斯反演、数论分块、杜教筛。题目传送门题意简述求以下式子的值,对\(20101009\)(一个质数)取模:\[\sum\limits_{i=1}^n\sum\limits_{j=1}^m\operatorname{lcm}(i,j)\]\(n,m\le10^7\)。加强:\(n,m\le10^{10}\)。解法莫比乌斯反......
  • 2024-03 STEMA 考试C++ 中级真题解析
    2024-03-10STEMA考试C++中级真题解析一、选择题(50分)1、    (110010)2+(c3)16的结果是(B )。A.(240)10        B.(11110101)2        C.(366)8        D.(f6)16备注:此题目下标代表进制,因不支持md格式。  2、   表达式1000/3的结果是(......
  • 服务平滑迁移:eureka迁移到nacos。无法注册双中心的问题解决
    迁移的文档:https://www.alibabacloud.com/help/zh/edas/developer-reference/smoothly-migrate-a-spring-cloud-cluster-that-contains-multiple-applications-to-edas其中遇到的问题未配置排除配置项时(exclude={RibbonEurekaAutoConfiguration.class}),ribbonServerList不是......
  • Qt QToolBox 的常用方法
    在界面上拉一个ToolBox控件,和三个按钮控件:代码如下:1#include"widget.h"2#include"ui_widget.h"3#include<QGroupBox>4#include<QDebug>5#include<QMessageBox>6#include<QToolButton>7#include<QVBox......
  • Codeforces Round 933 (Div. 3) A - G 题解
    CodeforcesRound933(Div.3)A-RudolfandtheTicketSolution因为\(n\)很小,直接枚举\(b_i+c_j\)所产生的所有数字Code#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn,m,k;cin>>n>>m>>k;intans=0;......
  • thinkphp 5 跨域问题解决
    版本:5.1.41LTS从网上搜到好多从/public/index.php添加heade信息,或者用中间件,或者添加behavior操作,可以做到解决跨域问题,但是亲身试验了都不行,今天刚找了一个,可以使用,放在这里header('Access-Control-Allow-Credentials:true');header('Access-Control-Allow-Methods:GET,......
  • Qt QToolBox tab 文字居中
    背景:在利用QToolBox实现一个简单的抽屉控件/导航控件时,发现QToolBox::tab的标题总是居左。尝试使用text-align属性、subcontrol-xxx属性都不起作用。解决办法:利用padding属性进行"硬编码"。代码片段如下:1//当前窗口的宽度,其中2//TOOLBOXWND_WIDTH:......