1. 程式人生 > >2832_生日宴會_二分

2832_生日宴會_二分

turn continue 準備 tdi 服務員 return bsp 我們 con

題目描述

Alice在餐館裏當服務員,今天是她生日,她請求廚師幫她準備生日晚餐,晚餐由N種原料做成,每道菜所需每種原料的數量是一樣的。
  廚房裏有一些原料,但不夠,Alice還需要從旁邊的超市中購買一些回來。超市裏什麽原料都有,每種原料都分大包裝和小包裝。Alice有M元錢,她想利用這M元錢購買原料使得能做出最多的菜。

思路

我們可以二分一個能做出的菜的數量,然後通過暴力判斷出能否即可

#include <stdio.h>
#define N 101
#define INF 0x7f7f7f7f
#define min(x, y) ((x) < (y) ? (x) : (y))
int
n, m; struct arr { int x, y, sm, pm, sv, pv; }a[N]; int check(int mid) { int ttt = 0; for (int i = 1; i <= n; i++) { int t = a[i].x * mid - a[i].y; if (t <= 0) continue; int tot = INF; int j; for (j = 0; a[i].sm * j <= t; j++) {
int l = t - a[i].sm * j; int r = l / a[i].sv; if (l > r * a[i].sv) r++; tot = min(tot, j * a[i].pm + r * a[i].pv); } j = t / a[i].sm; if (t > j * a[i].sm) j++; tot = min(tot, j * a[i].pm); j = t / a[i].sv; if (t > j * a[i].sv) j++; tot
= min(tot, j * a[i].pv); if (tot == INF) return 0; if (tot != INF) ttt += tot; if (ttt > m) return 0; } return 1; } int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) scanf("%d%d%d%d%d%d", &a[i].x, &a[i].y, &a[i].sm, &a[i].pm, &a[i].sv, &a[i].pv); int l = 0, r = 100100; int ans = 0; while (l <= r) { int mid = (l + r) >> 1; if (check(mid)) { ans = mid; l = mid + 1; } else r = mid - 1; } printf("%d\n", ans); }

2832_生日宴會_二分