題目連線: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
不要臉的求贊+關注+收藏