P1678 烦恼的高考志愿
题目链接:
本题容易想到用二分进行优化,但其中有几个细节需要注意一下。
注意点1、特判
if (curr < a[0]) res += abs(curr - a[0]);
(该测试点为
2、可以二分出第一个
#include <bits/stdc++.h> using namespace std; using LL = long long; const int N = 1e5 + 5; int m, n; int a[N], b[N]; LL res; int main() { scanf("%d%d", &m, &n); for (int i = 0; i < m; i++) scanf("%d", &a[i]); for (int i = 0; i < n; i++) scanf("%d", &b[i]); sort(a, a + m); for (int i = 0; i < n; i++) { int curr = b[i], l = 0, r = m - 1; while (l < r) { int mid = l + r >> 1; if (a[mid] >= curr) r = mid; else l = mid + 1; } if (curr < a[0]) res += abs(a[0] - curr); else res += min(abs(a[l] - curr), abs(a[l - 1] - curr)); } printf("%lld", res); return 0; }
3、类似地,可以二分出第一个
#include <bits/stdc++.h> using namespace std; using LL = long long; const int N = 1e5 + 5; int m, n; int a[N], b[N]; LL res; int main() { scanf("%d%d", &m, &n); for (int i = 0; i < m; i++) scanf("%d", &a[i]); for (int i = 0; i < n; i++) scanf("%d", &b[i]); sort(a, a + m); for (int i = 0; i < n; i++) { int curr = b[i], l = 0, r = m - 1; while (l < r) { int mid = l + r + 1 >> 1; if (a[mid] <= curr) l = mid; else r = mid - 1; } if (curr < a[0]) res += abs(a[0] - curr); else res += min(abs(a[l] - curr), abs(a[l + 1] - curr)); } printf("%lld", res); return 0; }
本文作者:胖柚の工作室
本文链接:https://www.cnblogs.com/pangyou3s/p/18016442
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步