풀이
[백준] 28493 - Burgers (c++)
땅왕
2024. 9. 21. 00:42
NOI 2023 Qualification 4번 문제이다.
https://www.acmicpc.net/problem/28493
한줄평
진짜 어려운 문제였다. 매개 변수 탐색을 연습할 필요가 있다고 느꼈다.
문제 요약
N가지의 재료가 있다. A버거와 B버거가 있고 각각 들어가는 재료가 다르다. 버거의 갯수를 최대로 만들어라.
풀이 (log10^9*N)
- 매개 변수 탐색
만들 버거의 개수를 기준으로 매개 변수 탐색을 하면 된다. 각 개수에 대해 재료를 순회하며 A버거를 만들 수 있는 최소,최대 개수를 갱신하면 그 개수가 가능한지 불가능한지 알 수 있다. (A버거를 만들 수 있는 개수의 교집합이 있으면 가능, 없으면 불가능)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main() {
cin.tie(0)->sync_with_stdio(0);
int n;cin>>n;
ll x[n],a[n],b[n];
for(ll &i:x)cin>>i;
for(ll &i:a)cin>>i;
for(ll &i:b)cin>>i;
int l=0,r=1e9;
while(l<=r) {
int mid =(l+r)/2;
ll amn=0,amx=1e9;
bool can =1;
for(int i=0;i<n;i++) {
if(a[i] == b[i]) {
if(x[i]/a[i] < mid) can = 0;
}
else if(a[i]<b[i]) {
if(a[i]*mid>x[i]) can=0;
if(b[i]*mid>x[i])
amn=max(amn,mid-(x[i] -a[i]*mid) /(b[i] -a[i]));
}
else {
if(b[i]*mid>x[i]) can=0;
if(a[i]*mid>x[i])
amx=min(amx,(x[i]-b[i]*mid)/(a[i]-b[i]));
}
}
if(can&&amn<=amx)
l=mid+1;
else
r=mid-1;
}
cout<< r;
}