Markcpp13 @ 2022-07-22 13:01:15
请各位大佬看看为什么会错。 我输入样例后结果一直不出来,好像是死循环。 以下是代码。
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int const N=100005;
int n,m,i,k,l,r,mid,temp,s,a[N];
long long ans;
int main()
{
scanf("%d%d",&m,&n);
for(i=1;i<=m;i++)
scanf("%d",&a[i]);
sort(a+1,a+m+1);
for(i=1;i<=n;i++)
{
scanf("%d",&k);
l=1;r=n;
while(l<r)
{
mid=(l+r)>>1;
if(a[mid]==k)
{
temp=mid;
break;
}
else if(a[mid]>k)
r=mid;
else l=mid;
}
ans+=abs(a[temp]-k);
}
printf("%lld",ans);
}
本人能力有限,希望回复时能说的简单点。
by ben090302 @ 2022-07-22 13:20:44
@Markcpp13
while(l<r-1)
还有你代码本身也有问题
by Unknown___Error @ 2022-07-22 13:21:38
r=mid+1
l=mid-1
by ben090302 @ 2022-07-22 13:24:19
@Unknown___Error 我写的是r=mid l=mid我过了
by Unknown___Error @ 2022-07-22 13:27:30
额,加减打反了
by ben090302 @ 2022-07-22 13:28:40
@Unknown___Error 他这么写就没错
by Nicolay @ 2022-07-22 13:33:37
while(l<r)
{
mid=(l+r)>>1;
if(a[mid]==k)
{
temp=mid;
break;
}
else if(a[mid]>k)
r=mid;
else l=mid;
}
这里应该改成
while(l<=r)
{
mid=(l+r)>>1;
if(a[mid]==k)
{
temp=mid;
break;
}
else if(a[mid]>k)
r=mid-1;
else l=mid+1;
}
可以自己画一画,每次写出l,r,和mid的值
by Nicolay @ 2022-07-22 13:36:40
二分后面也有问题 如果在a数组里没有找到与k相等的值那么temp就是空的
by ben090302 @ 2022-07-22 13:36:44
@Nicolay 求问一下,我这个为什么能过?
#include<bits/stdc++.h>
using namespace std;
int a[100000],b[100000];
int main()
{
int s=0,y;
int max=10000;
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1);
for(int j=1;j<=m;j++)cin>>b[j];
int left,right,mid;
for(int i=1;i<=m;i++)
{
left=1;
right=n;
while(left<right-1)
{
mid=(left+right)/2;
if(b[i]>=a[mid])
left=mid;
else right=mid;
}
if((b[i]-a[left])<abs(a[right]-b[i]))
{
y=abs(b[i]-a[left]);
}else y=abs(a[right]-b[i]);
s+=y;
}
cout<<s;
return 0;
}
by ben090302 @ 2022-07-22 13:37:35
@Nicolay 真心不懂,我和您说的修改后的也不一样啊
by ben090302 @ 2022-07-22 13:39:58
@Nicolay 求教(无恶意)