Codeforces Round 920 (Div. 3) D Very Different Array
D Very Different Array
题意
给出两个长度分别为n,m的数组a,c,n<m,从c中选择n个数并找到一个序列使得D=∑ni=1|ai−ci|尽可能大,求D的值
思路
假设如果m和n一样大,那么找到这个序列的方法很简单:将两个序列分别排序后将其中一个转置,就可以使D尽可能大(可以用数学归纳法证明,第一步假设对k个数的序列转置后匹配可使D最大)。
当m>n时,需要考虑的就是如何选择n个数字。将两个序列排序后,从前面的结论我们可以得出,如果要为a中的第一个数寻找对应的匹配数,那么必然是c中的最后一个数,同理要为a中的最后一个数寻找对应的匹配数,那么必然是c中的第一个数。因此我们只要对a中的第一和最后一个数的两个情况贪心地考虑哪一种情况的|ai−ci|更优,然后就可以完成本题
主要代码
void solve()
{
int n, m;
cin >> n >> m;
vector<int> a(n + 10), b(m + 10);
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int j = 1; j <= m; j++)
cin >> b[j];
sort(a.begin() + 1, a.begin() + 1 + n);
sort(b.begin() + 1, b.begin() + 1 + m);
int l = 1, r = m;
int L = 1, R = n;
ll ans = 0;
while (L <= R) {
if (abs(a[L] - b[r]) > abs(a[R] - b[l])) {
ans += abs(a[L] - b[r]);
L++;
r--;
}
else{
ans += abs(a[R] - b[l]);
R--;
l++;
}
}
cout << ans << "\n";
}
分类:
刷题笔记
标签:
codeforces
, 贪心
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· dotnet 源代码生成器分析器入门
· 官方的 MCP C# SDK:csharp-sdk
· 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
· 一步一步教你部署ktransformers,大内存单显卡用上Deepseek-R1
· 一次Java后端服务间歇性响应慢的问题排查记录