题目名字
烦恼的高考志愿(二分+sort函数)
题目链接
题意
每个学生的分数与预估分数线为不满意度,求出每个学生不满意度的总和
思路
- 先用sort函数来把学校的预估分数线进行从小到大排序;
- 再用二分查找出每个学生选择与自己分数接近的预估分数线
坑点
- 可能会出现负数的情况,所以要用绝对值
算法一:二分+sort函数
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int a[1000005];
int b[1000005];
int m,n;
long long int sum;
int main(void)
{
cin>>m>>n;
for(int i=0;i<m;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
sort(a,a+m);
for(int i=0;i<n;i++)
{
int l=0,r=m-1;
while(l<r)
{
int mid=l+r>>1;
if(a[mid]>=b[i]) r=mid;
else l=mid+1;
}//这一步是给每个学生选最接近的数
if(a[l]==b[i]) continue;//继续循环;
if(b[i]<=a[0]) {
sum+=abs(b[i]-a[0]);
continue;
}
if(b[i]>=a[m-1]){
sum+=abs(b[i]-a[m-1]);
continue;
}
sum+=min(abs(b[i]-a[l]),abs(b[i]-a[l-1]));
}
cout<<sum<<endl;
return 0;
}