P9124 [USACO23FEB] Bakery S 题解
MiPloRAs_3316 · · 题解
题目传送门 | 珂能更好的食用体验
题意概述
- 奶牛需要为 TA 的
n 个朋友制作糕点(a_i 个A 和b_i 个B )。每个朋友最多等待c_i 个单位时间,如果没有拿到糕点,TA 就会伤心地离开。 - 制作
1 个A 需要t_c 个单位时间,制作1 个B 需要t_m 个单位时间。 - 奶牛可以花费 ¥
1 去升级 TA 的烤箱。升级后,可以少花1 个单位时间来生产1 个A 或少花1 个单位时间来生产1 个B 。 - 求出她必须花费的最少的 money,以便她的面包店能够满足所有朋友的需求。
解题思路
我们可以先假设对于第
于是,显而易见的:(看起来很简洁但一点都不好解)
令
令
所以,就可以根据上述不等式进行二分答案了。(二分的当然是
接下来,浅浅说一下不等式的解集:
上述第
同时,
Code
#include<bits/stdc++.h>
using namespace std;
long long T,n,tc,tM,a[110],b[110],c[110];
bool check(long long x)
{
long long maxx=min(tc-1,x);
long long minn=max(0LL,x-tM+1);
for(int i=1; i<=n; i++)
{
long long k=c[i]-a[i]*tc-b[i]*tM+b[i]*x;
if(b[i]-a[i]==0)
{
if(k<0) return false;
}
else if(b[i]-a[i]>0) maxx=min(maxx,(long long)floor(k*1.0/(b[i]-a[i])));//二式
else minn=max(minn,(long long)ceil(k*1.0/(b[i]-a[i])));//三式
}
return maxx>=minn;//判断是否有解
}
int main()
{
for(cin>>T;T;T--)
{
cin>>n>>tc>>tM;
for(int i=1; i<=n; i++)
cin>>a[i]>>b[i]>>c[i];
long long l=-1,r=tc+tM-1;
while(l+1<r)//简单的二分答案
{
long long mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid;
}
cout<<r<<endl;
}
return 0;
}