題目背景
計算機競賽小組的神牛V神終於結束了萬惡的高考,然而作爲班長的他還不能閒下來,班主任老t給了他一個艱鉅的任務:幫同學找出最合理的大學填報方案。可是v神太忙了,身後還有一羣小姑娘等着和他約會,於是他想到了同爲計算機競賽小組的你,請你幫他完成這個艱鉅的任務。
題目描述
現有 m(m\le100000)m(m≤100000) 所學校,每所學校預計分數線是 a_i(a_i\le10^6)ai(ai≤106)。有 n(n\le100000)n(n≤100000) 位學生,估分分別爲 b_i(b_i\le10^6)bi(bi≤106)。
根據n位學生的估分情況,分別給每位學生推薦一所學校,要求學校的預計分數線和學生的估分相差最小(可高可低,畢竟是估分嘛),這個最小值爲不滿意度。求所有學生不滿意度和的最小值。
輸入格式
第一行讀入兩個整數m,n。m表示學校數,n表示學生數。第二行共有m個數,表示m個學校的預計錄取分數。第三行有n個數,表示n個學生的估分成績。
輸出格式
一行,爲最小的不滿度之和。
輸入輸出樣例
輸入 #1複製
4 3 513 598 567 689 500 600 550
輸出 #1複製
32
說明/提示
數據範圍:
對於30%的數據,m,n<=1000,估分和錄取線<=10000;
對於100%的數據,n,m<=100,000,錄取線<=1000000。
分析:
- 首先二話不說先排序,lower_boud和upper_bound都是在有序列表中才有用
- 本來以爲要找到比估分低的學校,,,竟然要找離分數最近的數,不知道出題人是什麼邏輯。。。離分數線近了就能上哪個?
- lower_bound的作用是在是個有序列表中,找到第一個大於等於要查找元素的迭代器,找不到返回該集合末尾的迭代器,數組中就是下標索引值。找到後只需與前一個元素比較,哪個接近分數選哪個學校
- 最後考慮兩個邊界(具體見代碼)
- 查找到的元素在第一個,即第一個就大於等於分數。
- 沒找到
#include <bits/stdc++.h>
using namespace std;
const int MAX = 1000005;
int M,N;
int a[MAX];
int main() {
scanf("%d%d",&M,&N);
for (int i = 0; i < M; ++i) {
scanf("%d",&a[i]);
}
sort(a,a+M);
int sum=0;
for (int i = 0; i < N; ++i) {
int x;
scanf("%d",&x);
int index = lower_bound(a,a+M,x)-a;
if(index==M) {
sum+=x-a[M-1];
continue;
}
if(index==0) {
sum+=a[0]-x;
continue;
}
if(a[index]==x) continue;
else if(a[index]>x){
sum+=min(x-a[index-1],a[index]-x);
}
}
printf("%d\n",sum);
}