满江红爆0玄关

P1678 烦恼的高考志愿

xukeyu @ 2024-08-08 19:22:02


#include<bits/stdc++.h>
using namespace std;
int n,a[1000001],m,b,sum,l,r;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+1+n);
    r=n+1;
    cin>>m;
    for(int i=1;i<=m;i++){
        cin>>b;
        while(l<r){
            int mid=(l+r)>>1;
            if(a[mid]>=b) r=mid;
            if(a[mid]<b) l=mid+1;
        } 
        if(a[l]-b<=b-a[l-1]) sum+=a[l]-b;
        else sum+=b-a[l-1];
    }
    cout<<sum;
    return 0;
}

by xukeyu @ 2024-08-08 19:23:12

在线等QwQ


by liaocr @ 2024-08-08 19:25:32

@xukeyu m要和n一起输入


by xukeyu @ 2024-08-08 19:26:02

@liaocr 额,6,


by mayike @ 2024-08-08 19:26:09

你为啥 l=0,r=n+1,不应该 l=1,r=n 吗?


by xukeyu @ 2024-08-08 19:27:06

@mayike 这里n + 1是为了保证在数组a的范围内进行查找。


by xukeyu @ 2024-08-08 19:28:04

现在代码:


#include<bits/stdc++.h>
using namespace std;
int n,a[1000001],m,b,sum,l,r;
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+1+n);
    r=n+1;
    for(int i=1;i<=m;i++){
        cin>>b;
        while(l<r){
            int mid=(l+r)>>1;
            if(a[mid]>=b) r=mid;
            if(a[mid]<b) l=mid+1;
        } 
        if(a[l]-b<=b-a[l-1]) sum+=a[l]-b;
        else sum+=b-a[l-1];
    }
    cout<<sum;
    return 0;
}

by liaocr @ 2024-08-08 19:28:51

@xukeyu 把m和n一起输入 for循环里l和r都要设置回去


by mayike @ 2024-08-08 19:28:52

@xukeyu 不过你的数据是 1~n 啊,建议以后不要这么做,就按题目范围来。不然容易出错


by xukeyu @ 2024-08-08 19:29:44

@liaocr @mayike 说的是


by liaocr @ 2024-08-08 19:29:56

@xukeyu 改完之后60了 代码:

#include<bits/stdc++.h>
using namespace std;
int n,a[1000001],m,b,sum,l,r;
int main(){
    cin>>n >> m;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+1+n);
    r=n+1;
    for(int i=1;i<=m;i++){
        l = 1;
        r = n+1;
        cin>>b;
        while(l<r){
            int mid=(l+r)>>1;
            if(a[mid]>=b) r=mid;
            if(a[mid]<b) l=mid+1;
        } 
        if(a[l]-b<=b-a[l-1]) sum+=a[l]-b;
        else sum+=b-a[l-1];
    }
    cout<<sum;
    return 0;
}

| 下一页