2832_生日宴會_二分
阿新 • • 發佈:2017-11-07
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)) intn, 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_生日宴會_二分