10pts,二分,人已疯

P1678 烦恼的高考志愿

AIMEE11 @ 2024-06-15 17:21:39

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int m, n;
long long a[100005], b[100005];
long long int ans;
int search(int l, int r, int x) {
    while(l<r) {
        int mid=(l+r)/2;
        if(a[mid]>=x) r=mid;
        else l=mid+1;
    }
    return r;
}
int main() {
    cin>>m>>n;//a学校,b估分
    for(int i=1; i<=m; i++) cin>>a[i];
    for(int i=1; i<=n; i++) cin>>b[i];
    sort(a+1, a+n+1);
    for(int i=1; i<=n; i++) {
        int zy;
        zy=search(1, m+1, b[i]);
        int p, q;
        p=abs(a[zy]-b[i]); q=abs(a[zy-1]-b[i]);
        ans+=min(p,q);//前插的位置前后的分差
    }
    cout<<ans;
    return 0;
}

只对了一个点,二分用的是前插。

不太理解为什么错,求助


by huangshuchang @ 2024-06-15 17:26:14

#include <bits/stdc++.h> 
using namespace std;
const int maxn=1e6+100;
int a[maxn];
int find(int l,int r,int key){
    int ans=-1;
    while (l<=r){
        int mid=l+(r-l)/2;
        if(a[mid]==key){
            ans=mid;
            return ans;
        }
        else if(a[mid]<key) l=mid+1; 
        else r=mid-1;
    }
    return l;
}
int main(){
    int n,m,i,x,t;
    long long sum=0; 
    cin>>m>>n;
    for (i=1;i<=m;i++) cin>>a[i];
    sort(a+1,a+1+m); 
    for (i=1;i<=n;i++){
        cin>>x;
        if(x<a[1]) sum=sum+a[1]-x; 
        else{
            t=find(1,m,x);
            sum=sum+min(abs(a[t]-x),abs(a[t-1]-x));
        }
    }
    cout<<sum;
    return 0;
}

@AIMEE11


by AIMEE11 @ 2024-06-15 17:26:42

@huangshuchang thanks,我看看


by AIMEE11 @ 2024-06-15 17:30:12

不是,我寻思着我思路也对的呀,然后我看了看我代码好像也没错,我二分已经自己测试过了没问题,然后main里面我也看了,除了输入可以更简便就没什么了,怎么才10pts


by AIMEE11 @ 2024-06-15 17:39:34

woc,知道为啥了,排序写错了


by huangshuchang @ 2024-06-15 17:51:22

求关注 @AIMEE11


by AIMEE11 @ 2024-06-15 20:24:52

@huangshuchang 小号关注


|