呆呆的她啊 @ 2019-07-30 16:47:25
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int x,cn=0,m,a[100001],n,i,b[100001],l,r,mid;
cin>>n>>m;
for(i=1;i<=n;i++)//n代表学校 m代表学生
//a【i]代表学校的录取分数线 b【i】代表学生的分数
cin>>a[i];//输入每个学校的录取分数线
sort(a+1,a+n+1);
sort(b+1,b+1+m);
//快排,把所有学校录取分数线排序
for(i=1;i<=m;i++)
cin>>b[i];//输入每个学生的估值
for(i=1;i<=m;i++)
{
l=1;r=n;
while(l<=r)
{
mid=(l+r)/2;
if(b[i]>=a[mid])
l=mid+1;//大的学校
else r=mid-1;//小的学校
}//二分查找,找出学生估值所在那两个学校的录取分数线之间
x=abs(b[i]-a[r])<abs(a[l]-b[i])?abs(b[i]-a[r]):abs(a[l]-b[i]);//比与学生估值高的和低的两个学校的录取分数线进行相减取绝对值,作为该学生的不满意度
cn+=x;//计算不满意度总和
}
cout<<cn;//输出
}
by bigju @ 2019-07-30 16:53:24
改了?
by arekilldog @ 2019-08-08 14:47:48
同样wa了3个点,是不是#3,#8,#10这3个点啊
#include<bits/stdc++.h>
using namespace std;
int m,n,a[110000],b,ans;
void Init(){
cin>>m>>n;
for(int i=1;i<=m;i++)
cin>>a[i];
sort(a+1,a+1+m);
}
int ef(int x){
int l=0,r=1+m,mid;
while(l+1<r){
mid=(l+r)/2;
if(a[mid]>=x)
r=mid;
else
l=mid;
}
return min(abs(a[r-1]-x),abs(a[r]-x));
}
int main(){
Init();
for(int i=1;i<=n;i++){
cin>>b;
ans+=ef(b);
}
cout<<ans;
return 0;
}
by 六尺之下 @ 2020-07-13 12:23:46
我也wa了3,8,10这三个点
#include<bits/stdc++.h>
using namespace std;
long long m,n,sum=0;
int main() //m学校数,n学生数,a1学校录取线,b1学生估分
{
scanf("%lld%lld",&m,&n);
long long a1[m+2],b1[n+2];
for(long long i=1;i<=m;i++) scanf("%lld",&a1[i]);
for(long long i=1;i<=n;i++) scanf("%lld",&b1[i]);
sort(a1+1,a1+m+1); sort(b1+1,b1+n+1);
for(long long i=1;i<=n;i++)
{
long long p=lower_bound(a1+1,a1+m+1,b1[i])-a1;//找到与估分最接近的分数线的数组下标
sum=sum+min(abs(a1[p]-b1[i]),abs(b1[i]-a1[p-1]));//比较两个,得出最小值
}
printf("%lld",sum);
return 0;
}