烦恼的高考志愿

题目描述

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

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

输入

第一行两个整数 m,n
第二行 m 个整数表示 ai
第三行 n 个整数表示 bi

输出

一行一个整数,为不满意度之和的最小值。

样例输入:

4 3
513 598 567 689
500 600 550

样例输出:

32

思路:

(为什么要写这么水的一道题啊!!?)
咳咳~,也是特别的水昂。

思路很简单,就是找到第一个严格大于等于其预估分数的录取分数,再将其下标 - 1 ,就可以找到比其小中最大的录取分数,将两个录取分数与预估分数相减取绝对值,存入答案数组即可,以此循环。

就这么简单!!(手写二分版,可以用STL)

代码:

#include <bits/stdc++.h>
using namespace std;

int a[100005];
int n,m;
int l,r;

int search(int v){
	l = 0,r = n;
	while(l < r){
		int mid = (l+r)/2;
		if(a[mid] < v){
			l = mid + 1;
		}
		else{
			r = mid;
		}
	}
	return l;
}

int main(){
	scanf("%d%d",&n,&m);
	for(int i = 1;i <= n;i++){
		scanf("%d",&a[i]);
	}
	sort(a+1,a+n+1);
	int ans = 0,k;
	for(int i = 1;i <= m;i++){
		scanf("%d",&k);
		int a1 = search(k);
		int a2 = a1-1;
		if(a2 == 0){
			ans += abs(k - a[a1]);
		}
		else{
			ans += min(abs(k - a[a1]),abs(k - a[a2]));
		}
	}
	printf("%d",ans);
	return 0;
}
posted @ 2022-04-23 21:32  XDFZ武斌  阅读(222)  评论(0)    收藏  举报