#NOIP2016J1Q35. [NOIP 2016 普及组初赛] 第 35 题

[NOIP 2016 普及组初赛] 第 35 题

(郊游活动) 有n名同学参加学校组织的郊游活动,已知学校给这n名同学

								的郊游总经费为A元,与此同时第i位同学自己携带了M i 元。为了方便郊
								游,活动地点提供B(≥n)辆自行车供人租用,租用第j辆自行车的价格为C j 元,每位同学可以使用自己携带的钱或者学校的郊游经费,为了方便账务管
								理,每位同学只能为自己租用自行车,且不会借钱给他人,他们想知道最多
								有多少位同学能够租用到自行车。 本题采用二分法。对于区间[l,r],我们取中间点mid并判断租用到自行
								车的人数能否达到mid。判断的过程是利用贪心算法实现的。
#include <iostream>
using namespace std;

#define MAXN 1000000
int n, B, A, M[MAXN], C[MAXN], l, r, ans, mid;

bool check(int nn) {
    int count = 0, i, j;
    i = 【第1空】;
    j = 1;
    while (i <= n) {
        if (【第2空】)
            count += C[j] - M[i];
        i++;
        j++;
    }
    return 【第3空】;
}

void sort(int a[], int l, int r) {
    int i = l, j = r, x = a[(l + r) / 2], y;
    while (i <= j) {
        while (a[i] < x) i++;
        while (a[j] > x) j--;
        if (i <= j) {
            y = a[i]; a[i] = a[j]; a[j] = y;
            i++; j--;
        }
    }
    if (i < r) sort(a, i, r);
    if (l < j) sort(a, l, j);
}

int main() {
    int i;
    cin >> n >> B >> A;
    for (i = 1; i <= n; i++)
        cin >> M[i];
    for (i = 1; i <= B; i++)
        cin >> C[i];
    sort(M, 1, n);
    sort(C, 1, B);
    l = 0;
    r = n;
    while (l <= r) {
        mid = (l + r) / 2;
        if (【第4空】) {
            ans = mid;
            l = mid + 1;
        } else
            r = 【第5空】;
    }
    cout << ans << endl;
    return 0;
}

请填写【第4空】。

{{ input(1) }}