洛谷题单指南-二分查找与二分答案-P1678 烦恼的高考志愿
原题链接:https://www.luogu.com.cn/problem/P1678
题意解读:要计算不满意度之和的最小值,就要保证每个人的不满意度最小,即选择的学校录取分数-学生分数之差的绝对值最小。
解题思路:
如何在学校录取分数中找与学生分数最接近的呢?有三种可能:
1、学生分数在录取分数中存在相等的
2、学生分数在录取分数中不存在,找刚好比学生分数大的录取分数
3、学生分数在录取分数中不存在,找刚好比学生分数小的录取分数
正好可以对应二分的两种模版,
模版1:要么找到相等值,要么找到刚好大于学生分数的值
模版2:要么找到相等值,要么找到刚好小于学生分数的值
用两个二分计算之后,取录取分数-学生分数的绝对值较小的。
100分代码:
#include <bits/stdc++.h>
using namespace std;
const int M = 100005, N = 100005;
int a[M], b[N], m, n;
long long ans;
int bs1(int x)
{
int l = 1, r = m, res = -1;
while(l <= r)
{
int mid = (l + r) >> 1;
if(a[mid] >= x) res = mid, r = mid - 1;
else l = mid + 1;
}
return res;
}
int bs2(int x)
{
int l = 1, r = m, res = -1;
while(l <= r)
{
int mid = (l + r) >> 1;
if(a[mid] <= x) res = mid, l = mid + 1;
else r = mid - 1;
}
return res;
}
int main()
{
cin >> m >> n;
for(int i = 1; i <= m; i++) cin >> a[i];
for(int i = 1; i <= n; i++) cin >> b[i];
sort(a + 1, a + m + 1);
for(int i = 1; i <= n; i++)
{
int idx1 = bs1(b[i]);
int idx2 = bs2(b[i]);
int v = INT_MAX;
if(idx1 != -1) v = min(v, abs(a[idx1] - b[i]));
if(idx2 != -1) v = min(v, abs(a[idx2] - b[i]));
ans += v;
}
cout << ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?