题目背景
计算机竞赛小组的神牛 V 神终于结束了高考,然而作为班长的他还不能闲下来,班主任老 t 给了他一个艰巨的任务:帮同学找出最合理的大学填报方案。可是 v 神太忙了,身后还有一群小姑娘等着和他约会,于是他想到了同为计算机竞赛小组的你,请你帮他完成这个艰巨的任务。
题目描述
现有 𝑚m 所学校,每所学校预计分数线是 𝑎𝑖ai。有 𝑛n 位学生,估分分别为 𝑏𝑖bi。
根据 𝑛n 位学生的估分情况,分别给每位学生推荐一所学校,要求学校的预计分数线和学生的估分相差最小(可高可低,毕竟是估分嘛),这个最小值为不满意度。求所有学生不满意度和的最小值。
输入格式
第一行读入两个整数 𝑚,𝑛m,n。𝑚m 表示学校数,𝑛n 表示学生数。
第二行共有 𝑚m 个数,表示 𝑚m 个学校的预计录取分数。第三行有 𝑛n 个数,表示 𝑛n 个学生的估分成绩。
输出格式
输出一行,为最小的不满度之和。
输入输出样例
输入 #1复制
4 3 513 598 567 689 500 600 550
输出 #1复制
32
说明/提示
数据范围:
对于 30%30% 的数据,1≤𝑛,𝑚≤10001≤n,m≤1000,估分和录取线 ≤10000≤10000;
对于 100%100% 的数据,1≤𝑛,𝑚≤1000001≤n,m≤100000,估分和录取线 ≤1000000≤1000000 且均为非负整数。
代码
#include<bits/stdc++.h>
using namespace std;
int sch[1000010],stu[1000010];
int main()
{
int n,m;
int ans=1;
long long tot=0;
cin>>m>>n;
for(int i=1;i<=m;i++) cin>>sch[i];
for(int i=1;i<=n;i++) cin>>stu[i];
sort(sch+1,sch+1+m);
sort(stu+1,stu+1+n);
for(int i=1;i<=n;i++)
{
ans=1;
//cout<<i<<endl;
int l=1,r=m;
while(l+1<r)
{
//cout<<tot<<endl;
int mid=(l+r)/2;
//printf("(%d+%d)/2=%d\n",l,r,mid);
if(sch[mid]>stu[i])
{
r=mid;
}
else if(sch[mid]==stu[i])
{
ans=0;
break;
}
else if(sch[mid]<stu[i])
{
l=mid;
}
}
if(ans==0) continue;
if(stu[i]-sch[l]>sch[r]-stu[i]) tot=tot+max(sch[r],stu[i])-min(sch[r],stu[i]);
else tot=tot+max(stu[i],sch[l])-min(stu[i],sch[l]);
}
printf("%lld",tot);
return 0;
}