KEYENCE Programming Contest 2024(AtCoder Beginner Contest 374)E题

2024/10/12 19:29 第一次;

2024/10/12 20:29大为感动再次修改;

六年级蒟蒻来题解了!!!

题目大意:

给定你一个n,表示有n个生产线,每一个生产线都有两种机器,第i个生产线第一件产品每天可以造Ai件零件但是得付出Pi元的代价,第二件产品每天可以生产Bi件物品但是得付出Qi元的代价,然后给你x元的预算问你所有流水线中的最小值的最大值是多少?

思路:

首先我们想暴力的话肯定是不行的。所以我们只能用二分答案。那二分什么呢?我们看他这个最大值是有单调性的越大它要花的钱也就最大。我们现在就把一个选择性的问题变成了一个判断性的问题。每一次二分到的答案我们尽量的去满足他,算出它所需花的最小数然后在比较看是否符合。

那我们推到了这里如果你懂了,恭喜你普及组第一道水题你学会了!!!

接下来我们要想怎么优化剩余部分呢???(大声喘气)我们可以知道这里最好的方式就是把这一个当前枚举的答案全部不多不少,刚刚好!!!对吧!所以我们取AB的最小公倍数就可以达到这样的效果然后我们尝试着用A去替换B,用B去替换A,然后在求出最小值就行了!!!(窒息~~)

如果你又又又听懂了(那么诺贝尔物理学奖是你的了)开一个玩笑(不介意吧!!!)说实话你听懂了的话普及组第二题你可能也会做了!!!

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define ft first
#define sd second
typedef long long ll;
ll n,x;
vector<pair<pair<ll,ll>,pair<ll,ll>>>v;
ll fun(ll mid){
    ll sum=0;
    for(ll i=1;i<=n;i++){
        ll minn=4e18;
        for(int j=0;j<=v[i].sd.ft;j++){
            minn=min(minn,v[i].ft.sd*j+(max(0ll,mid-j*v[i].ft.ft)+v[i].sd.ft-1)/v[i].sd.ft*v[i].sd.sd);
        }
        for(int j=0;j<=v[i].ft.ft;j++){
            minn=min(minn,v[i].sd.sd*j+(max(0ll,mid-j*v[i].sd.ft)+v[i].ft.ft-1)/v[i].ft.ft*v[i].ft.sd);
        }
        sum+=minn;
        if(sum>x){
            break;
        }
    }
    return sum;
}
//cout
int main(){
    cin>>n>>x;
    v=vector<pair<pair<ll,ll>,pair<ll,ll>>>(n+1);
    for(ll i=0;i<n;i++){
        cin>>v[i+1].ft.ft>>v[i+1].ft.sd>>v[i+1].sd.ft>>v[i+1].sd.sd;
    }
    ll l=0,r=1e9;
    while(l<r){
        ll mid=(r+l+1)/2;
        if(fun(mid)>x){
            r=mid-1;
        }else{
            l=mid;
        }
    }
    cout<<r;
}

如果这篇题解对你有帮助的话,就求求你点一下一个不需钱钱的小小的赞、收藏和关注吧!!求求了! (你的一个小小的一戳,是我最大的动力!!!)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值