【反悔贪心】AtCoder ABC376 E. Max × Sum
前言
反悔贪心是贪心算法的一种改进或扩展策略。贪心算法是指仅考虑每步最优,从而达到全局最优。在传统贪心算法的基础上,反悔贪心允许算法在一定条件下进行回溯或调整。简言之就是采取骑驴找马的策略,在别无选择的情况下,先选择当前最优解,当有更好的选择的时候,将之前最糟糕的选择替换为新的选择。
题目
https://atcoder.jp/contests/abc376/tasks/abc376_e
题意
输入一个正整数
对于每个测试用例,输入两个正整数
选出恰好
题解
将数组
参考代码
#include<bits/stdc++.h> using namespace std; typedef long long ll; constexpr int N = 2e5 + 7; int T, n, k; int a[N], b[N], c[N]; void solve() { ll ans = 0LL, sum = 0LL; cin >> n >> k; iota(c, c + n, 0); for (int i = 0; i < n; ++ i) cin >> a[i]; for (int i = 0; i < n; ++ i) cin >> b[i]; sort(c, c + n, [&](const int &i, const int &j) { return a[i] != a[j] ? a[i] < a[j] : b[i] < b[j]; }); priority_queue<int> pq; for (int i = 0; i < k; ++ i) { sum += b[c[i]]; pq.push(b[c[i]]); } ans = a[c[k - 1]] * sum; for (int i = k; i < n; ++ i) { if (pq.top() > b[c[i]]) { sum += b[c[i]] - pq.top(); pq.pop(); pq.emplace(b[c[i]]); ans = min(ans, sum * a[c[i]]); } else { ans = min(ans, (sum - pq.top() + b[c[i]]) * a[c[i]]); } } cout << ans << '\n'; } int main() { ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr); cin >> T; while (T --) { solve(); } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 从 Windows Forms 到微服务的经验教训
· 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee