P1678 烦恼的高考志愿——二分查找(注意处理左右边界情况!)
烦恼的高考志愿
题目背景
计算机竞赛小组的神牛 V 神终于结束了高考,然而作为班长的他还不能闲下来,班主任老 t 给了他一个艰巨的任务:帮同学找出最合理的大学填报方案。可是 v 神太忙了,身后还有一群小姑娘等着和他约会,于是他想到了同为计算机竞赛小组的你,请你帮他完成这个艰巨的任务。
题目描述
现有
根据
输入格式
第一行读入两个整数
第二行共有
输出格式
输出一行,为最小的不满度之和。
样例 #1
样例输入 #1
4 3 513 598 567 689 500 600 550
样例输出 #1
32
提示
数据范围:
对于
对于
#include <bits/stdc++.h> using namespace std; int search(vector<long>& nums, long target) { int i = 0; int j = nums.size() - 1; while (i <= j) { int m = i + (j - i) / 2; if (nums[m] < target) { i = m + 1; } else { j = m - 1; } } // (左边界)确保i在范围内,处理越界问题 if (i == 0) { return abs(nums[i] - target); } // 【易错】(右边界)如果没有找到,会指向数组末端插入点,因此要返回abs(nums[i - 1] - target) if (i == nums.size()) { return abs(nums[i - 1] - target); } // 计算与nums[i]和nums[i-1]的差距 return min(abs(nums[i] - target), abs(nums[i - 1] - target)); } int main() { long m, n, sum = 0; cin >> m >> n; vector<long> colleges(m); for (int i = 0; i < m; i++) { cin >> colleges[i]; } sort(colleges.begin(), colleges.end()); vector<long> students(n); for (int i = 0; i < n; i++) { cin >> students[i]; } for (int i = 0; i < n; i++) { sum += search(colleges, students[i]); } cout << sum; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律