CodeForces 734C - Anton and Making Potions

药剂生产优化算法
本文介绍了一种优化算法,用于解决在有限预算下如何通过选择不同的操作来最小化生产特定数量药剂所需的时间。该算法结合了二分查找与枚举技术,并利用了操作成本的单调性特点。

题意:你需要生产n个药剂,现在你有两种操作,一种是将生产一瓶药剂的时间x变成ai,这个操作需要花费bi。第二个操作是立刻生产ci瓶药剂,这种操作花费di。第一种操作总共有k种,第二种操作总共有m种。问在花费不超过s的情况下,生产n瓶药水所需要花费的最少时间。题目保证d的输入是递增的。且每种操作只能选择一种。

思路:比较显然的是如果不考虑第一种操作,只考虑第二种操作,因为d存在单调性我们可以找到最大的djs,时间复杂度为O(logn),但是因为还有第一种操作,对于第一种操作我们可以直接枚举,对于每种ai,二分查找最大的djsai。然后每次维护最小值即可。总的时间复杂度O(nlogn)。其中需要对二分需要一定的特殊处理。但实际上对于每个aij=upper_bound(d)1

#include <cstdio>
#include <string>
#include<iostream>
#include<vector>
#include <stack>
#include <queue>
#include <map>
#include <cstdlib>
#include<string.h>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long ll;
typedef pair<int, int>pii;
typedef pair<ll, ll> pll;
typedef pair<int, ll> pil;

const int MAXN = 300000 + 10;

ll a[MAXN], b[MAXN], c[MAXN], d[MAXN];

int main()
{
    ll  n, m, k, x, s;
    scanf("%I64d%I64d%I64d%I64d%I64d", &n, &m, &k, &x, &s);
    a[0] = x; b[0] = 0; c[0] = 0; d[0] = 0;
    for (int i = 1; i <= m; i++)scanf("%I64d", a + i);
    for (int i = 1; i <= m; i++)scanf("%I64d", b + i);
    for (int i = 1; i <= k; i++)scanf("%I64d", c + i);
    for (int i = 1; i <= k; i++)scanf("%I64d", d + i);
    ll ans = n*x;
    for (int i = 0; i <= m; i++)
    {
        if (s >= b[i])
        {
            ll flag = s - b[i];
            ll left = 0, right = k;
            while (left < right)
            {
                ll mid = (left + right) / 2;
                if (d[mid] <= flag)
                {
                    if (d[mid + 1]>flag){ left = mid; break; }
                    else left = mid + 1;
                }
                else right = mid;
            }
            ans = min(ans, a[i] * (n - c[left]));
        }
    }
    printf("%I64d\n", ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值