#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;
}
//可以运行,但是不可以通过

1 条评论

  • @ 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

    信息

    ID
    5736
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    100
    已通过
    22
    上传者