P1678 烦恼的高考志愿求助!!!

P1678 烦恼的高考志愿

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 求教(无恶意)


| 下一页