题解:P10730 [NOISG 2023 Qualification] Burgers
Error_Eric · · 题解
Statement
为了避免歧义,这里用
可以认为是
Sol
几何意义上这是求一个(二维)凸包内
二分答案,假设
可以通过消掉
分类讨论
check 的时候只需要保证第二种情况得到满足,第一、三种解出来不是空集就可以。当然注意
Code
#include<iostream>
#include<algorithm>
#include<vector>
#include<numeric>
using namespace std;
int n, ans = 0;
vector<long long> a, b, c;
bool check(int d){ // if x + y = d has solution
long long maxx = d, minx = 0;
for(int i = 0; i < n && minx <= maxx; i++){
if(a[i] > b[i])
maxx = min(maxx, (c[i] - b[i] * d) / (a[i] - b[i]));
else if (a[i] < b[i])
minx = max(minx, (c[i] - b[i] * d -1) / (a[i] - b[i]) + 1);
else if (a[i] * d > c[i]) return false;
}
return minx <= maxx;
}
int main(){
ios::sync_with_stdio(0),
cin.tie(0), cout.tie(0);
cin >> n;
for(auto vec:{&c, &a, &b}){
vec->resize(n);
for(long long&vx:(*vec))
cin >> vx;
}
for(int k = (1<< 30); k; k>>=1){
if(ans + k < 1e9 && check(ans+k))
ans += k;
}
cout << ans << endl;
}