改了一位题解大佬的答案 结果wa了3个点 求解!3Q

P1678 烦恼的高考志愿

呆呆的她啊 @ 2019-07-30 16:47:25

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int x,cn=0,m,a[100001],n,i,b[100001],l,r,mid;
    cin>>n>>m;
    for(i=1;i<=n;i++)//n代表学校 m代表学生 
    //a【i]代表学校的录取分数线   b【i】代表学生的分数   
    cin>>a[i];//输入每个学校的录取分数线
    sort(a+1,a+n+1);
    sort(b+1,b+1+m);

    //快排,把所有学校录取分数线排序
    for(i=1;i<=m;i++)
    cin>>b[i];//输入每个学生的估值
    for(i=1;i<=m;i++)
    {
        l=1;r=n;
        while(l<=r)
        {
            mid=(l+r)/2;
            if(b[i]>=a[mid])
            l=mid+1;//大的学校 
            else r=mid-1;//小的学校 
        }//二分查找,找出学生估值所在那两个学校的录取分数线之间
        x=abs(b[i]-a[r])<abs(a[l]-b[i])?abs(b[i]-a[r]):abs(a[l]-b[i]);//比与学生估值高的和低的两个学校的录取分数线进行相减取绝对值,作为该学生的不满意度
        cn+=x;//计算不满意度总和
    }
    cout<<cn;//输出
}

by bigju @ 2019-07-30 16:53:24

改了?


by arekilldog @ 2019-08-08 14:47:48

同样wa了3个点,是不是#3,#8,#10这3个点啊

#include<bits/stdc++.h>
using namespace std;
int m,n,a[110000],b,ans;
void Init(){
    cin>>m>>n;
    for(int i=1;i<=m;i++)
        cin>>a[i];
    sort(a+1,a+1+m);
}
int ef(int x){
    int l=0,r=1+m,mid;
    while(l+1<r){
        mid=(l+r)/2;
        if(a[mid]>=x)
            r=mid;
        else
            l=mid;
    }
    return min(abs(a[r-1]-x),abs(a[r]-x));
}
int main(){
    Init();
    for(int i=1;i<=n;i++){
        cin>>b;
        ans+=ef(b);
    }
    cout<<ans;
    return 0;
}

by 六尺之下 @ 2020-07-13 12:23:46

我也wa了3,8,10这三个点

#include<bits/stdc++.h>
using namespace std;
long long m,n,sum=0;
int main() //m学校数,n学生数,a1学校录取线,b1学生估分 
{
    scanf("%lld%lld",&m,&n);
    long long a1[m+2],b1[n+2];
    for(long long i=1;i<=m;i++) scanf("%lld",&a1[i]);
    for(long long i=1;i<=n;i++) scanf("%lld",&b1[i]);
    sort(a1+1,a1+m+1); sort(b1+1,b1+n+1);
    for(long long i=1;i<=n;i++)
    {
        long long p=lower_bound(a1+1,a1+m+1,b1[i])-a1;//找到与估分最接近的分数线的数组下标
        sum=sum+min(abs(a1[p]-b1[i]),abs(b1[i]-a1[p-1]));//比较两个,得出最小值
    }
    printf("%lld",sum);
    return 0;
}

|