abc282 E - Choose Two and Eat One
题意:
个球,第 个球上有数 ,每次操作选两个球,得到 的收益,丢弃两球之一。重复操作直到只剩一个球,问最大收益
思路:
,在 之间连一条边权为 的无向边。图的每棵生成树都与一种方案对应:以随便一个点为根,从下开始选边,每次丢弃儿子
跑此图的最大生成树即可
void sol() {
cin >> n >> M;
for(int i = 1; i <= n; i++)
cin >> a[i];
vector<array<int, 3> > edges; // weight, u, v
for(int i = 1; i <= n; i++)
for(int j = i + 1; j <= n; j++)
edges.push_back({(qmi(a[i], a[j]) + qmi(a[j], a[i])) % M, i, j});
sort(edges.begin(), edges.end());
reverse(edges.begin(), edges.end());
iota(p, p + N, 0);
ll ans = 0;
for(auto [w, u, v] : edges)
if(get(u) != get(v))
p[get(u)] = get(v), ans += w;
cout << ans;
}
标签:
最小生成树
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】