题解:P10730 [NOISG 2023 Qualification] Burgers
Handezheng · · 题解
题解:P10730
前言
题目传送门
博客食用更佳
本题解借鉴了部分楼上大佬的内容,但是我想详细讲一下赚点估值,以便理解(楼上的题解我看了两天才看懂)。
题意
两种汉堡,一个汉堡对于原料
思路
首先想到贪心,很明显,贪心是错的。因为你在选择原料时并不知道是优先选哪个汉堡,也不知道每种汉堡要选多少个。
其次想到 DP。如此你会发现,转移方程不知道怎么写,而且时间会超。
我们发现,对于一个整数
有了单调性,下意识想到二分。可是难题又来了:我们的
我们发现,如果 废话),这样用到的原料总数就会更多,就有可能超出
同理,当
在
袋马
与楼上大佬大差不差(感觉我的更简洁),注释请看楼上
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define F(i,l,r) for(int i = l;i <= r;i++)
const int N = 1e6 + 50,M = 1e3 + 50;
const int INF = 0x3f3f3f3f3f3f3f3f,INT = 0x7fffffff;
const int mod = 1e9 + 7;
int n,x[N],a[N],b[N];
inline bool check(int k){
int mi=0,ma=1e9;
//上界和下界
F(i,1,n){
if(a[i]==b[i]){
if(a[i]*k>x[i]) return 0;
}else if(a[i]<b[i]){
if(a[i]*k>x[i]) return 0;
if(b[i]*k<=x[i]) continue;
mi=max(mi,k-(x[i]-a[i]*k)/(b[i]-a[i]));
// a[i]的下界
}else{
if(b[i]*k>x[i]) return 0;
if(a[i]*k<=x[i]) continue;
ma=min(ma,(x[i]-b[i]*k)/(a[i]-b[i]));
}
}
return (mi <= ma);
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n;
F(i,1,n) cin>>x[i];
F(i,1,n) cin>>a[i];
F(i,1,n) cin>>b[i];
int l=0,r=1e9;
while(l<=r){
int mid = (l+r) >>1;
if(check(mid)) l=mid+1;
else r=mid-1;
}
cout<<r;
return 0;
}
AC记录
——