有没有哥哥看看手写的二分哪里错了30分

P1678 烦恼的高考志愿

aa2211034566 @ 2024-02-03 22:55:42

#include<iostream>
#include<cmath>
#include<bits/stdc++.h>
using namespace std;
int school[101000];
int student[101000];
long long int sum=0;
long long int zanshi=0;
int guji(int x,int a[],int l,int r){
    if(l>r){
        return -1;
    }
    else{
        int mid=(l+r)/2;
        if(a[mid]>=x){
            int t=guji(x,a,l,mid-1);
            if(t==-1){
                return mid; 
            }
            else{
                return t;
            }
        }
        if(a[mid]<x){
            return guji(x,a,mid+1,r);
        }
    }
}//找比他大,如果最大返回-1和最后一个元素相减 最小返回1第一个元素 
//找的到就返回位置
//找不到返回-1 
int main(){
    int m,n;
    cin>>m>>n;
    for(int i=1;i<=m;i++){
        cin>>school[i];
    }
    for(int i=1;i<=n;i++){
        cin>>student[i];
    }
    sort(school+1,school+m);
    for(int i=1;i<=n;i++){
        int k=guji(student[i],school,1,m);
        int e;
        if(k==1){ //所有都比他大 
            e=abs(student[i]-school[k]);
        }
        else if(k>1){ 
            e=min(abs(student[i]-school[k]),abs(student[i]-school[k-1]));
        }
        else{ //所有都比他小 
            e=student[i]-school[m];
        }
        sum+=e;
    }
    cout<<sum;
  return 0;
}

by masonxiong @ 2024-02-07 16:30:00

你的 sort() 函数使用不对

应写为 sort(school+1, school+m+1)


|