首页 > 其他分享 >「比赛记录」AtCoder abc373 (9.28)

「比赛记录」AtCoder abc373 (9.28)

时间:2024-09-29 17:34:16浏览次数:9  
标签:AtCoder 队列 题解 9.28 贡献 物品 dp abc373

CTH 想看 F 题解,于是先发出来

F.Knapsack with Diminishing Values

属于是翻译官方题解了

首先我们设 \(dp_{w,j}\) 表示从权重为 \(w\) 或更小的物品中选总重为 \(j\) 的物品可以得到的最大幸福度。

考虑 \(dp\) 的转移。

我们把所有物品按照权重 \(w\) 分为多组,(每一组中所有物品的 \(w\) 相同,但 \(v\) 可能不同),设 \(f_{w,k}\) 表示从单个物品重为 \(w\) 的组中选出 \(k\) 个物品的最大幸福度。

假设我们已经知道 \(f_{w,k}\),那么可以得到 \(dp\) 的转移如下:(\(W\) 为题目中的 \(W\))

\[dp_{w,j}=dp_{w-1,j-kw}+f_{w,k}\ \ (k\in [\ 0,\lfloor \frac{j}{w}\rfloor \ ], j\in [\ 0,W\ ]) \]

那么这道题便做出来了,现在我们需要做的就是考虑如何求 \(f_{w,k}\) ,可以用一种贪心的策略。

首先我们需要知道:\(k\times v-k^2 = \sum_{i=1}^{k} (v-2i+1)\),式子好推,但这是关键。

有了这个式子,我们可以理解为第一次使用一种物品 \(i\) 会有 \(v_i-1\) 的贡献,之后再使用一次每次的贡献就会减少 \(2\),即第 \(j\) 次使用物品 \(i\) 会有 \(v_i-1-2(j-1)\) 的贡献。

所以对于同一组即权重都为 \(w\) 的物品,最开始先用一个优先队列维护所有不同种物品的 \(v_i-1\),每次肯定优先使用队列顶端的所表示物品,并且更新队列,大概就是以下三种操作:

  • 取出队列顶 \(d\) 为现在改组所有物品中可以提供的最大贡献。

  • 更新 \(f_{w,k}\),\(f_{w,k} = f_{w,k-1}+d\);

  • 更新队列,其实就是将 \(d-2\) 再次入队。

标签:AtCoder,队列,题解,9.28,贡献,物品,dp,abc373
From: https://www.cnblogs.com/YuenYouth/p/18439123

相关文章

  • 史上最详细论文word排版格式指导规范保姆级教学(2024.9.28)!
    前言首先,每个学校的论文排版格式都是不太相同的,但大体上都是相似的。正常来说,论文的排版操作是十分枯燥并且重复的,但是word中的样式工具使得论文排版会变得容易。接下来我将以某个学校论文格式要求为例,进行论文格式排版的操作。全文一共有5500多字,你只需要辛苦一次将这......
  • ABC373F 题解
    容易发现这是一个完全背包问题,我们设状态\(f_{i,j}\)表示前\(i\)个物品使用了\(j\)个容量的最大价值。容易写出转移方程式:\(f_{i,j}=\max\limits_{k=0}^{\lfloor\frac{j}{w}\rfloor}f_{i-1,j-kw}+kv-k^2\)直接dp是\(O(n^3)\)。考虑对这个dp进行优化。上面的方程容......
  • [ABC373F] Knapsack with Diminishing Values
    AtCoder比较遗憾,E题用了太多时间了,没做出来。当时看到有平方感觉难道是斜率优化之类的?这下猜对了。拜谢WA90。不过官解好像没用斜率优化?不会。设\(f_{i,j}\)表示前\(i\)个物品一共用了\(j\)的体积。直接暴力做是三次方的。当加入一个体积为\(w\),价值为\(v\)的物品......
  • AtCoder Beginner Contest 373
    这场咋这么简单A.September\(\text{diff11}\)给你\(12\)个字符串\(S_1\)到\(S_{12}\),问你有多少字符串满足\(|S_i|=i\)点击查看代码usingnamespacereader;strings[13];intmain(){ for(inti=1;i<=12;++i){ cin>>s[i]; } intans=0; for(inti=1;i<=12......
  • R机械设计V4.2(2024.09.28)
    下载:https://pan.baidu.com/s/1Dphz0m8BQWcg-T-AaeoaYA提取码:0520R机械设计V4.2(2024.09.28)更新:1、新增齿轮计算模块2、新增同步带计算模块3、新增耗气量计算模块4、全新自定义模块,(可导入旧版本数据)5、更新螺钉数据6、修正“一般设计资料-过程”速比参数  ......
  • 2024.9.28 bisect 模块
    bisect模块是Python标准库中的一个模块,主要用于维护已排序的列表。它提供了一些函数,帮助你在一个有序序列中查找元素的插入位置,以便保持序列的有序性。以下是bisect模块的一些常用功能:常用函数bisect.bisect_left(a,x,lo=0,hi=len(a)):返回元素x应该插入到列表a......
  • AtCoder Beginner Contest 373
    A-September题意给\(12\)个字符串,问长度等于标号的字符串个数。思路模拟。代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintmxn=1e6+5;voidsolve(){ intans=0; for(inti=0;i<12;i++) { ......
  • 题解 ABC373G【No Cross Matching】/ POJ3565【Ants】
    题目描述年轻的自然主义者比尔在学校里研究蚂蚁。他的蚂蚁以生活在苹果树上的蚜虫为食。每个蚂蚁群需要自己的苹果树来养活自己。比尔有一张地图,上面标有\(n\)个蚂蚁群和\(n\)棵苹果树的坐标。他知道蚂蚁从它们的蚂蚁群到它们的取食地点,然后返回蚂蚁群,都是使用化学标记的路线......
  • 9.28.2
    importjava.util.Random;publicclassFourArithmeticOperations{publicstaticvoidmain(String[]args){Randomrandom=newRandom();for(inti=0;i<30;i++){intnum1=random.nextInt(100);intnum2=random.nextInt(100);intoperator=random......
  • 9.28
    1:在Java中,枚举类型是一种特殊的数据类型,用于定义一组有限的常量值。以下是枚举类型的一些基本用法:一、定义枚举类型二、使用枚举常量三、遍历枚举常量四、在switch语句中使用枚举常量五、添加属性和方法2:在Java中,double类型的数值进行运算得不到“数学上精确”的结......