CF1839B题解
-
分析
根据题意,对于所有
的灯,我们最多可以一次开 盏。最优方案一定是只开
相同的灯,因为开一盏大的会使等于 的灯少开一盏,而且最后不会坏掉,会一直占着一个名额,从而使当前 一直到更大的 的轮次一直少开一盏,这个亏损必定大于等于多开一盏大 轮次的灯所带来的利益(因为不提前开这个灯在他自己的 的轮次还是可以开包括这个灯在内的 盏灯,而提前开这个灯就不会在自己的轮次开,而且只能开 盏,所以总利润还是 盏灯的利润,而且提前的轮数到当前的轮数会一直亏损一盏灯的利润,所以亏损必定大于等于利润),所以不开大的,小的可以看做在小的轮次里面开大的,这已经知道是必定不赚的决策了,所以只开 相同的。显然对于所有
的灯,我们选 最大的 盏灯就行,注意到 最大为 ,所以开long long。 -
代码
#include <iostream>
#include <vector>
#include <algorithm>
#define int long long
using namespace std;
constexpr int MAXN(1000007);
vector <int> e[MAXN];
int T, n;
inline void read(int &temp) { cin >> temp; }
inline bool cmp(int x, int y) { return x > y; }
inline void work() {
for (int i(1); i <= n; ++i) e[i].clear();
int ans(0);
read(n);
for (int i(1), a, b; i <= n; ++i) read(a), read(b), e[a].push_back(b);
for (int i(1); i <= n; ++i) sort(e[i].begin(), e[i].end(), cmp);
for (int i(1); i <= n; ++i) {
if (!e[i].size()) continue;
for (int j(0); j < min(i, (int)e[i].size()); ++j) ans += e[i][j];
}
cout << ans << endl;
}
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
read(T);
while (T--) work();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】