- 烦恼的高考志愿
论最后一个测试点通不过(求助大佬)
- 2025-1-1 12:29:47 @
#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 条评论
-
zswdlqy LV 7 @ 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
- 上传者