CSP/信奥赛C++刷题训练:经典二分例题(2):洛谷P1678:烦恼的高考志愿

CSP/信奥赛C++刷题训练:经典二分例题(2)

烦恼的高考志愿

题目背景

计算机竞赛小组的神牛 V 神终于结束了高考,然而作为班长的他还不能闲下来,班主任老 t 给了他一个艰巨的任务:帮同学找出最合理的大学填报方案。可是 v 神太忙了,身后还有一群小姑娘等着和他约会,于是他想到了同为计算机竞赛小组的你,请你帮他完成这个艰巨的任务。

题目描述

现有 m m m 所学校,每所学校预计分数线是 a i a_i ai。有 n n n 位学生,估分分别为 b i b_i bi。

根据 n n n 位学生的估分情况,分别给每位学生推荐一所学校,要求学校的预计分数线和学生的估分相差最小(可高可低,毕竟是估分嘛),这个最小值为不满意度。求所有学生不满意度和的最小值。

输入格式

第一行读入两个整数 m , n m,n m,n。 m m m 表示学校数, n n n 表示学生数。

第二行共有 m m m 个数,表示 m m m 个学校的预计录取分数。第三行有 n n n 个数,表示 n n n 个学生的估分成绩。

输出格式

输出一行,为最小的不满度之和。

样例 #1

样例输入 #1

4 3
513 598 567 689
500 600 550

样例输出 #1

32

提示

数据范围:

对于 30 % 30\% 30% 的数据, 1 ≤ n , m ≤ 1000 1\leq n,m\leq1000 1≤n,m≤1000,估分和录取线 ≤ 10000 \leq10000 ≤10000;

对于 100 % 100\% 100% 的数据, 1 ≤ n , m ≤ 100000 1\leq n,m\leq100000 1≤n,m≤100000,估分和录取线 ≤ 1000000 \leq 1000000 ≤1000000 且均为非负整数。

用二分求解

满分代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
//二分:升学排序后,二分查找边界:数组中第一个>=x的元素的位置 
const int N=1e5+10;
int n,m,a[N],b[N]; //a为学校的分数线,b为学生的估分
//二分函数,找a数组中第一个>=x的元素的位置 
int f(int x){
	int l=1,r=m,mid;
	while(l<=r){
		mid=(l+r)/2;
		if(a[mid]>=x) r=mid-1;
		else l=mid+1;
	}
	if(l<=m) return l; //找到了 
	else return -1;//没找到 
}
long long ans=0; 
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 tmp=f(b[i]);//tmp为找到的a数组中第一个>=b[i]的元素的下标
		if(tmp==-1) ans+=b[i]-a[m]; //没找到的情况:b[i]比任何学校的分数线都高 
		else if(tmp==1) ans+=a[1]-b[i];//任何学校的分数线都比b[i]高 
		else ans+=min(abs(a[tmp]-b[i]),abs(a[tmp-1]-b[i]));
		//对比tmp和tmp前面那个分数线,哪个差值最小 
	} 
	cout<<ans;
	return 0;
}

文末彩蛋:

点击王老师青少年编程主页有更多精彩内容

相关推荐
程序猿阿伟6 分钟前
《C++中的魔法:实现类似 Python 的装饰器模式》
java·c++·装饰器模式
zyhomepage8 分钟前
科技的成就(六十四)
开发语言·人工智能·科技·算法·内容运营
Ethan Wilson14 分钟前
C++/QT可用的websocket库
开发语言·c++·websocket
想做白天梦26 分钟前
多级反馈队列
java·windows·算法
潇雷28 分钟前
算法Day12|226-翻转二叉树;101-对称二叉树;104-二叉树最大深度;111-二叉树最小深度
java·算法·leetcode
爱编程— 的小李1 小时前
开关灯问题(c语言)
c语言·算法·1024程序员节
韭菜盖饭1 小时前
LeetCode每日一题3211---生成不含相邻零的二进制字符串
数据结构·算法·leetcode
ergevv1 小时前
类的变量的初始化:成员初始化列表、就地初始化
c++·初始化·
极客代码1 小时前
C/C++ 随机数生成方法
c语言·开发语言·c++·算法
甜甜向上呀2 小时前
【数据结构】快速排序(三种实现方式)
算法·排序算法