CodeForces 1909D Split Plus K
设最后每个数都相等时为 。那么一次操作变成了合并两个数 ,再增加 。于是每个 可以被表示成 的形式,化简得 。
因为 对于每个 都相同,又因为我们的目标是最小化 ,所以 取 最优。
注意所有 同号才合法,以及特判掉初始 全部相同的情况后不能出现 。
code
// Problem: D. Split Plus K // Contest: Codeforces - Pinely Round 3 (Div. 1 + Div. 2) // URL: https://codeforces.com/contest/1909/problem/D // Memory Limit: 256 MB // Time Limit: 1000 ms // // Powered by CP Editor (https://cpeditor.org) #include <bits/stdc++.h> #define pb emplace_back #define fst first #define scd second #define mkp make_pair #define mems(a, x) memset((a), (x), sizeof(a)) using namespace std; typedef long long ll; typedef double db; typedef unsigned long long ull; typedef long double ldb; typedef pair<ll, ll> pii; const int maxn = 200100; ll n, m, a[maxn]; void solve() { scanf("%lld%lld", &n, &m); ll s = 0, g = 0; bool fl = 1; for (int i = 1; i <= n; ++i) { scanf("%lld", &a[i]); s += a[i]; g = __gcd(g, abs(a[i] - m)); fl &= (a[i] == a[1]); } if (fl) { puts("0"); return; } ll ans = 0; int x = 0; for (int i = 1; i <= n; ++i) { if (a[i] == m) { puts("-1"); return; } if (a[i] > m) { x |= 1; } else { x |= 2; } ans += abs(a[i] - m) / g; } printf("%lld\n", x == 3 ? -1LL : ans - n); } int main() { int T = 1; scanf("%d", &T); while (T--) { solve(); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】