#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int line[100005];
int main()
{
	int m,n;
	cin>>m>>n;
	int t=0,k=0;
	while(t<m)
	{
		cin>>line[t];
		t++;
	}
	sort(line,line+t);//以上是读入和排序分数线
	int sum=0;
	while(k<n)
	{
		int num;
		cin>>num;
		k++;
		int L=0,R=t-1;
		int ans=1000;//最小的差的绝对值,初始化为一个比较大的值
		while(L<=R)//终止条件
		{
			int mid=(L+R)/2;//取中间值判断
			if(line[mid]==num)
			{
				ans=0;
				break;//零必然为最小的所求解,所以可直接终止二分,节约时间
			}
			else if(line[mid]<num)
			{
				ans=min(ans,abs(line[mid]-num));
				L=mid+1;//可能的更好的答案在右边,右移,记录当前最优解,继续搜索
			}
			else if(line[mid]>num)
			{
				ans=min(ans,abs(line[mid]-num));
				R=mid-1;//可能的更好的答案在左边,左移,记录当前最优解,继续搜索
			}
		}
		sum+=ans;
	}
	cout<<sum;
}
//可以运行,但是不可以通过

2 comments

  • @ 2025-8-22 13:00:47

    用long long

    • @ 2025-1-15 15:14:27

      额......

      #include<bits/stdc++.h>
      using namespace std;
      int a[100005],b[100005],n,m,h; 
      int main(){
      	cin>>m>>n;
      	for(int i=1;i<=m;i++){
      		cin>>a[i];
      	}
      	for(int i=1;i<=n;i++){
      		cin>>b[i];
      	}
      	sort(a+1,a+m+1);
      	for(int i=1;i<=n;i++){
      		int k=lower_bound(a+1,a+n+1,b[i])-a;
      	    if(k==1){
      	    	h+=abs(a[k]-b[i]);
      		}
      		else if(k==m+1){
      			h+=abs(a[m]-b[i]);
      		}
      		else{
      			h+=min(abs(a[k]-b[i]),abs(a[k-1]-b[i]));
      		}
      	}
      	cout<<h;
      	return 0;
      }
      

      别抄袭

      • 1

      Information

      ID
      5736
      Time
      1000ms
      Memory
      256MiB
      Difficulty
      3
      Tags
      # Submissions
      144
      Accepted
      30
      Uploaded By