3 条题解

  • 0
    @ 2025-1-1 12:17:34
    #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;
    }
    

    信息

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