abc 374E
作者:
Air1222
,
2024-10-07 13:11:31
,
所有人可见
,
阅读 5
//题目描述:给定工钱,和一些步骤,每个步骤两个方案,工作效率以最小点算,求最优方案
//最小值最大,最大值最小(经典二分)
//在枚举方案时,优先考虑性价比高的(贪心)(考试时想到)
//从正面枚举,时间复杂度过高,发现每个步骤最大人数数据范围为100,则性价比低的选择数不可能超过100个,如果超过100,则一定可以同性价比高的方案平替,即,即性价比低的总数,不可能比一个性价比高的方案数量多
//因此枚举性价比低的方案数更优
//考试时,只想到用数学手段,未想到暴力枚举,以及从侧面枚举(应该优先想暴力,然后优化)
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 110;
int n,x;
LL a[N],p[N],b[N],q[N];
bool check(int mid)
{
LL sum=0;
for(int i=0;i<n;i++)
{
LL res=1e18;
for(int j=0;j<=100;j++)
{
LL res1=0;
int need=mid-a[i]*j;
res1+=j*p[i];
if(need>0)
res1+=(need+b[i]-1)/b[i]*q[i];
res=min(res,res1);
}
//cout<<mid<<" "<<i<<" "<<res<<endl;
sum+=res;
}
//cout<<sum<<endl;
return sum<=x;
}
int main()
{
cin>>n>>x;
for(int i=0;i<n;i++)
{
cin>>a[i]>>p[i]>>b[i]>>q[i];
if(a[i]*q[i]>b[i]*p[i])
{
swap(a[i],b[i]);
swap(p[i],q[i]);
}
}
//cout<<check(894742);
int l=0,r=1e9;
while(l<r)
{
int mid=l+r+1>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
cout<<l;
return 0;
}