(郊游活动)有n名同学参加学校组织的郊游活动,已知学校给这n名同学 的郊游总经费为A元,与此同时第 i 位同学自己携带了Mi元。为了方便郊游, 活动地点提供B(≥n)辆自行车供人租用,租用第j 辆自行车的价格为Cj元, 每位同学可以使用自己携带的钱或者学校的郊游经费,为了方便账务管 理,每位同学只能为自己租用自行车, 且不会借钱给他人, 他们想知道最多 有多少位同学能够租用到自行车。(第四、五空2.5分,其余3分)
本题采用二分法。对于区间[l, r] ,我们取中间点mid并判断租用到自行车的人数能否达到mid。判断的过程是利用贪心算法实现的。
#include
using namespace std;
#define MAXN 1000000
int n, B, A, M[MAXN], C[MAXN], l, r, ans, mid;
bool check(int nn) {
\tint count = 0, i, j;
\ti = (1) ;
\tj = 1;
\twhile (i <= n) {
\t\tif ( (2) )
\t\t\tcount = C[j] - M[i];
\t\ti ;
\t\tj ;
\t}
\treturn (3) ;
}
void sort(int a[], int l, int r) {
\tint i = l, j = r, x = a[(l r) / 2], y;
\twhile (i <= j) {
\t\twhile (a[i] < x) i ;
\t\twhile (a[j] > x) j--;
\t\tif (i <= j) {
\t\t\ty = a[i]; a[i] = a[j]; a[j] = y;
\t\t\ti ; j--;
\t\t}
\t}
\tif (i < r) sort(a, i, r);
\tif (l < j) sort(a, l, j);
}
int main() {
\tint i;
\tcin >> n >> B >> A;
\tfor (i = 1; i <= n; i )
\t\tcin >> M[i];
\tfor (i = 1; i <= B; i )
\t\tcin >> C[i];
\tsort(M, 1, n);
\tsort(C, 1, B);
\tl = 0;
\tr = n;
\twhile (l <= r) {
\t\tmid = (l r) / 2;
\t\tif ( (4) ) {
\t\t\tans = mid;
\t\t\tl = mid 1;
\t\t} else
\t\t\tr = (5) ;
\t}
\tcout << ans << endl;
\treturn 0;
}
发表评论 取消回复