計蒜客 煩惱的高考志願題解

2020-10-26 13:00:46

題目連線:https://nanti.jisuanke.com/t/T1874

題目

題面

計算機競賽小組的蒜頭君終於結束了萬惡的高考,然而作為班長的他還不能閒下來,班主任給了他一個艱鉅的任務:幫同學找出最合理的大學填報方案。可是蒜頭君太忙了,於是他想到了同為計算機競賽小組的你,請你幫他完成這個艱鉅的任務。
根據 n 位學生的估分情況,分別給每位學生推薦一所學校,要求學校的預計分數線和學生的估分相差最小(可高可低,畢竟是估分嘛),這個最小值為不滿意度。求所有學生不滿意度和的最小值。

輸入格式

在這裡插入圖片描述

輸出格式

輸出資料有一行,為最小的不滿度之和。

樣例

樣例輸入

4 3
513 598 567 689
500 600 550

樣例輸出

32

···································一條華麗的分割線···································

思路

就是二分!!!

標程

#include<bits/stdc++.h>
using namespace std;
int n,m,x[100001],y;
long long ans;
//	freopen("exam.in","r",stdin);
//	freopen("exam.out","w",stdout);
	ios_base::sync_with_stdio(false);
	cin.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>x[i];
    sort(x+1,x+n+1);
    while(m--){
        cin>>y;
        int l=0,r=n+1;
        while(l<r){
            int mid=(l+r)>>1;
            if(x[mid]<=y)l=mid+1;
			else r=mid;
        }
        if(y<=x[1])ans+=x[1]-y;
        else ans+=min(abs(x[l-1]-y),abs(x[l]-y));
    }
    cout<<ans<<endl;
    return 0;
}

然而……
似乎一(億)點問題

測評資訊
================================================
測評用例 1:正確通過 [1.000 毫秒,824 KB]
---------------------------
測評用例 2:正確通過 [1.000 毫秒,824 KB]
---------------------------
測評用例 3:正確通過 [1.000 毫秒,824 KB]
---------------------------
測評用例 4:正確通過 [31.000 毫秒,824 KB]
---------------------------
測評用例 5:正確通過 [33.000 毫秒,824 KB]
---------------------------
測評用例 6:正確通過 [29.000 毫秒,824 KB]
---------------------------
測評用例 7:正確通過 [32.000 毫秒,824 KB]
---------------------------
測評用例 8:正確通過 [18.000 毫秒,824 KB]
---------------------------
測評用例 9:答案錯誤 [48.000 毫秒,824 KB]
用例輸入:
100000 100000
79808 438278 497258 569994 60803 426031 660311 67857 808358 728753 839982 886334……
531664 661391 452414 199274 618734 170720 842030 385999 380027 680768 94886 5991……

用例正確輸出:
500200

你的輸出:
500173
---------------------------
測評用例 10:正確通過 [48.000 毫秒,824 KB]

結果
================================================
共 10 組測評用例,通過 9 組。

總分
================================================
9

這是那組沒過的資料

真正的標程

#include<bits/stdc++.h>
using namespace std;
long long p1,p2,d1,d2,ans,x,num[1100000],n,m;
int main(){
//	freopen("exam.in","r",stdin);
//	freopen("exam.out","w",stdout);
	ios_base::sync_with_stdio(false);
	cin.tie(0);
    cin>>m>>n;
    for(int i=0;i<m;i++)cin>>num[i];
    sort(num,num+m);
    while(n--){
        cin>>x;
        p1=lower_bound(num,num+m,x)-num;p2=p1-1;d1=d2=20000000;
        if(p1!=m)d1=num[p1]-x;
        if(p2!=-1)d2=x-num[p2];
        ans+=min(d1,d2);
    }
    cout<<ans<<endl;
    return 0;
}

完美AC

不要臉的求贊+關注+收藏