当前位置: 首页 > news >正文

AT_abc442_g [ABC442G] Lightweight Knapsack

来讲一下官解。

如果 \(K_i = 1\) 就是 CF808E,那题有神秘 DP 做法,感兴趣的可以去看看。

对于这题,肯定是要贪心的。有个显然的事情就是如果我们记重量为 \(w\) 的物品选了 \(F_w\) 个,那么我们肯定要贪心地选取 \(v\) 最大的那 \(F_w\) 个。

其次,我们可以将 \(6\)\(w = 1\) 的物品,或 \(3\)\(w = 2\) 的物品,或 \(2\)\(w = 3\) 的物品合并成一个 \(w = 6\) 的物品,合并带来的好处就是,我们不需要跑背包了,而是可以直接贪心地选取,因为 \(w\) 都是相同的。

但是现在问题是 \(F_1\) 不一定是 \(6\) 的倍数, \(w = 2, 3\) 同理,所以可能会有多出来的物品。无妨,我们假设 \(F_i \equiv R_i \pmod{\frac{6}{i}}\),即 \(F_1 \equiv R_1 \pmod 6\)\(F_2 \equiv R_2 \pmod 3\)\(F_3 \equiv R_3 \pmod 2\),那么我们优先把 \(v\)\(R_i\) 大的拿出来,剩下的合并即可。时间复杂度 \(\mathcal{O}(n \log nC)\),其中 \(C = \prod\limits_{i=1}^3 \frac{6}{i} = 36\)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
// typedef __int128 i128;
typedef pair<ll, ll> pll;
const int N = 2e5 + 10, mod = 998244353;
template<typename T>
void dbg(const T &t) { cout << t << endl; }
template<typename Type, typename... Types>
void dbg(const Type& arg, const Types&... args) {cout << arg << ' ';dbg(args...);
}
namespace Loop1st {
int n;
ll c, ans;
pair<ll, vector<pll>> merge(vector<pll> ls, int r, int g) { // 去掉最后 r 个,剩下的每 g 个合并成一组ll t = 0;while (r && !ls.empty()) {auto [v, k] = ls.back();if (k > r) { t += v * r; ls.back().second -= r; break; }t += v * k;r -= k;ls.pop_back();}vector<pll>res;ll cnt = 0, sum = 0;while (!ls.empty()) {auto [v, k] = ls.back();ls.pop_back();if (cnt) {if (cnt + k < g) {cnt += k;sum += v * k;continue;}k -= g - cnt;sum += v * (g - cnt);res.emplace_back(sum, 1);cnt = sum = 0;}if (k >= g) res.emplace_back(v * g, k / g);cnt = k % g;sum = v * cnt;}return {t, res};
}
void main() {vector<vector<pll>> ls(4);cin >> n >> c;for (int i = 0; i < n; i++) {ll w, v, k; cin >> w >> v >> k;ls[w].emplace_back(v, k);}for (int w = 1; w <= 3; w++) sort(ls[w].begin(), ls[w].end());for (int p = 0; p < 6; p++) {auto [t1, g1] = merge(ls[1], p, 6);for (int q = 0; q < 3; q++) {auto [t2, g2] = merge(ls[2], q, 3);for (int r = 0; r < 2; r++) {// dbg("###", p, q, r);auto [t3, g3] = merge(ls[3], r, 2);ll m = c - p - q * 2 - r * 3;if (m < 0) continue;m /= 6;ll sum = t1 + t2 + t3;auto g = g1;g.insert(g.end(), g2.begin(), g2.end());g.insert(g.end(), g3.begin(), g3.end());sort(g.begin(), g.end());while (!g.empty()) {auto [v, k] = g.back();if (k >= m) { sum += v * m; break; }m -= k;sum += v * k;g.pop_back();}ans = max(ans, sum);}}}cout << ans << '\n';
}}
int main() {// freopen("data.in", "r", stdin);// freopen("data.out", "w", stdout);ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int T = 1;// cin >> T;while (T--) Loop1st::main();return 0;
}
http://www.jsqmd.com/news/299302/

相关文章:

  • 基于STM32的有害气体检测系统
  • 基于STM32的汽车防盗报警系统设计
  • 基于STM32的电热水器控制系统设计
  • 2026年1月工业清洗与稀释剂厂家推荐榜单:脱漆剂/除蜡水/防锈油/溶剂油/助焊剂/碳氢清洗剂/环保型清洗剂/油墨稀释剂等专业化工产品源头供应
  • 基于STM32的土壤湿度检测系统
  • 基于STM32的多功能智能睡眠枕头
  • 基于STM32的农业大棚环境检测系统的设计与实现
  • 给儿子的金钱信:关于运气、谦逊与“睡个好觉”的权利
  • FastAPI系列(10):Request对象
  • python基础语法 3
  • 基于STM32 的老人跌倒监测系统设计与实现
  • 基于STM32单片机的温室大棚控制
  • 基于STM32单片机的自动宠物喂食
  • 基于stm32厨房一氧化碳烟雾浓度检测及火灾报警器的设计
  • 基于stm32的便携式voc气体检测仪设计
  • 基于Android和蓝牙的智慧停车场系统的设计与实现
  • 基于MQTT协议的物联网家庭安防系统设计
  • 基于NB-IoT的温湿度监测系统设计
  • 基于rfid的门禁防盗报警系统设计
  • stm32燃气检测系统
  • 2026必备!专科生毕业论文必看!TOP9 AI论文网站测评
  • 网络运维与网络安全 阶段一 基础篇十七
  • kotlin
  • 2026年 导热油厂家推荐排行榜:二苄基甲苯/氢化三联苯/烷基苯/合成与高低温导热油品牌深度解析
  • sb-flink1.13.1-jdk8-分隔字符串 20260125
  • 面试题目记录
  • 2026年 洁净室检测服务推荐榜单:自净时间/压缩空气/气流流型/无尘车间/手术室检测,专业认证与高效服务深度解析
  • 【题解】雪人三元组统计问题(循环移位 + 条件拆分优化)
  • Mapbox中如何对已经加载的线段进行编辑?
  • 吐血推荐!专科生必备8款AI论文工具测评