P9124 [USACO23FEB] Bakery S 题解

题意概述

nn 个人来买两种东西,你要使 ai×tc+bi×tmCia_i \times t_c +b_i \times t_m \leq C_i,但是不一定成立,所以可用一块钱减少 tct_ctmt_m 一个单位时间。

求最少要花费多少钱,才能使上式成立。


思路

不妨解这个不等式。既然要求答案,就将最小花费设为 kk,将升级 tct_c 的次数设为 xx。(注意:此处设的 xx 只是用于解不等式,不需要枚举。当 xx 有解时,kk 的值合法。)

则升级 tmt_m 的次数为 kxk-x

之前的式子可以表示为:

ai×(tcx)+bi×(tmkx)Cia_i \times (t_c-x) +b_i \times (t_m-k-x) \leq C_i

拆括号,移项得:

ai×xbi×xCiai×tcbi×tm+bi×ka_i \times x-b_i \times x \leq C_i-a_i \times t_c-b_i\times t_m+b_i \times k

提取公因式,得:

(biai)×xCiai×tcbi×tm+bi×k(b_i-a_i) \times x \leq C_i-a_i \times t_c-b_i\times t_m+b_i \times k

然后要对各种情况分类讨论,以下将右式表示为 rrbiaib_i-a_i 表示为 ll,原式可表示为 l×x=rl\times x=r

  • l=0l=0 时,当 0r0 \leq r 时,xx 有无数解(不用管),当 r<0r<0 时,xx 无解。

  • l>0l>0 时,移项得:xrlx \leq \frac{r}{l}(取上界)。

  • l<0l<0 时,移项得,xrlx \geq \frac{r}{l}(取下界)。

这样我们就获得了 xx 的取值范围。当处理完所有客人,xx 仍有正整数解时,说明 kk 合法。

只要枚举 kk,就可以取到 kk 的最小值。但是 0ktc+tm20 \leq k \leq t_c+t_m-22tc+tm2×1092 \leq t_c+t_m \leq 2 \times 10^9,超时了。

但是,kk 是有单调性的!不可能花了更多的钱,但不能解决花更少钱能解决的问题啊!所以直接二分答案。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll T;
ll N,TCN,TMN,maa,mab;
ll a[111],b[111],c[111];
bool check(ll mid) {
	ll maax=min(TCN-1,mid),miax=max(0LL,-TMN+mid+1);//最小上界,最大下界
	for(int i=1;i<=N;i++) {
		ll k=c[i]-a[i]*TCN-b[i]*TMN+b[i]*mid;
		if(b[i]-a[i]==0&&k<0) return 0;
        //此处将上界向下取,将下界向上取,可以杜绝 1.3<=1.4
		if(b[i]-a[i]>0) maax=min((ll)floor(k*1.0/(b[i]-a[i])),maax);
		if(b[i]-a[i]<0) miax=max((ll)ceil(k*1.0/(b[i]-a[i])),miax);
	}
	return miax<=maax;
}
int main() {
    cin>>T;
    while(T--) {
        cin>>N>>TCN>>TMN;
        for(int i=1;i<=N;i++) {
            cin>>a[i]>>b[i]>>c[i];
        }
        ll l=-1,r=TCN+TMN-1;//取两个取不到的值
        while(l+1<r) {
            ll mid=l+r>>1;
            if(check(mid)) {
                r=mid;
            }
            else {
                l=mid;
            }
        }
        cout<<r<<"\n";
    }
    return 0;
}

本文作者:cjrqwq

本文链接:https://www.cnblogs.com/yfzqwq/p/18492834

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   cjrqwq  阅读(7)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
展开
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.