烦恼的高考志愿
题目描述
计算机竞赛小组的神牛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;
}
本文来自博客园,作者:XDFZ武斌,转载请注明原文链接:https://www.cnblogs.com/XDFZwb1523/p/16183670.html

浙公网安备 33010602011771号