有 n 名同学参加学校组织的郊游活动,已知学校给这 n 名同学的郊游总经费为 A 元,与此同时第 i 位同学自己携带了 Mi 元。为了方便郊游,活动地点提供 B(≥n)辆自行车供人租用,租用第 j 辆自行车的价格为 Cj 元,每位同学可以使用自己携带的钱或者学校的郊游经费,为了方便账务管理,每位同学只能为自己租用自行车,且不会借钱给他人,他们想知道最多有多少位同学能够租用到自行车。
本题采用二分法。对于区间[l,r],我们取中间点mid并判断租用到自行车的人数能否达到mid。判断的过程是利用贪心算法实现的。
输入:
第一行输入n,B,A(B<1000000)
第二行输入n个数代表每位同学自己带的钱
第三行输入B个数代表每辆自行车的租金
输出:最多有多少位同学能够租用到自行车
输入样例:
3 3 2
1 2 3
3 3 3
输出样例
2
#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; }