二分查找算法之STL中lowerbound的妙用

題目背景

計算機競賽小組的神牛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);

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章