codeforces734C——Anton and Making Potions详解

  • Anton and Making Potions
  • 题目描述(google翻译)

    • 安东正在玩一个非常有趣的电脑游戏,但现在他被困在其中一个级别。为了进入下一个级别,他必须准备n个药水。

      安东有一个特殊的水壶,可以在x秒内准备一个魔药。此外,他知道两种类型的法术可以加快准备魔药的过程。

      这种类型的法术加速了一种魔药的准备时间。有这种类型的m个法术,其中第i个成本为bi manooints并且将每个药水的准备时间改为ai而不是x。
      这种类型的法术立即准备了一些魔药。有这样的法术,其中第i个成本为di manapoints并立即创造ci药水。
      安东可以使用不超过一种类型的第一种类型的咒语和不超过一种第二种类型的咒语,并且消耗的总数不应超过s。考虑到所有法术都会在安东开始准备魔药之前立即使用。

      安东希望尽可能快地达到一个新的水平,所以他感兴趣的是他需要花费最少的时间来准备至少n个药水。

  • 输入
输入的第一行包含三个整数n,m,k(1≤n≤2·109,1≤m,k≤2·105) - 安东必须制作的药水数量,咒语的数量第一种类型和第二种类型的法术数量。

输入的第二行包含两个整数x和s(2≤x≤2·109,1≤s≤2·109) - 准备一个药水所需的初始秒数和Anton可以使用的manapoints数量。

第三行包含m个整数ai(1≤ai<x) - 如果使用第一个类型的第i个咒语,则准备一个药水所需的秒数。

第四行包含m个整数bi(1≤bi≤2·109) - 使用第一个类型的第i个咒语的manapoints数。

第五行中有k个整数ci(1≤ci≤n) - 如果使用第二种类型的第i个咒语,将立即创建的药水数量。保证ci不减小,即如果i <j,则ci≤cj。

第六行包含k个整数di(1≤di≤2·109) - 使用第二种类型的第i个咒语所需的manapoints数。保证di不降低,即如果i <j,则di≤dj。
  • 输出

    • 打印一个整数 - 为了准备n个药水而必须花费的最短时间。
  • 样例输入 1
    • 20 3 2
      10 99
      2 4 3
      20 10 40
      4 15
      10 80
  • 样例输出 1
    • 20
  • 样例输入 2
    • 20 3 2
      10 99
      2 4 3
      200 100 400
      4 15
      100 800
  • 样例输出 2
    • 200
  • 问题分析
    • 题目隐含的条件是 B 药水的两个数组是非递减的
    • 需要二分的是 B 药水的 manapoints 消耗数
    • 遍历 A 药水,通过二分选择 B 药水,最后选择一个最小的答案
    • 初始化的时候要注意考虑可能 A,B 药水都用不上这种情况
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#define Maxn 2000003 using namespace std; typedef long long int LL; LL n,m,k,x,s,x1,s1; LL a_short_time[Maxn] = {};
LL a_cost[Maxn] = {}; LL b_pro_num[Maxn] = {};
LL b_cost[Maxn] = {}; int main()
{
ios::sync_with_stdio(false);
cin>>n>>m>>k>>x>>s;
LL i = ;
LL ans = n*x;
for(i = ; i <= m; i++)
cin >> a_short_time[i];
a_short_time[] = x;
for(i = ; i <= m; i++)
cin >> a_cost[i];
for(i = ; i <= k; i++)
cin >> b_pro_num[i];
for(i = ; i <= k; i++)
cin >> b_cost[i];
for(i = ; i <= m; i++)
{
if(s >= a_cost[i])
{
LL s1 = s - a_cost[i];
LL l = ,r = k;
while(l < r)
{
LL mid = (l + r) / ;
if(b_cost[mid] <= s1)
{
if(b_cost[mid+] > s1)
{
l = mid;
break;
}
else
l = mid + ;
}
else
r = mid;
}
ans = min(ans,a_short_time[i]*(n-b_pro_num[l]));
}
}
cout << ans;
return ;
}

二分算法题目训练(三)——Anton and Making Potions详解的更多相关文章

  1. 二分算法题目训练(一)——Shell Pyramid详解

    HDU2446——Shell Pyramid 详解 Shell Pyramid 题目描述(Google 翻译的) 在17世纪,由于雷鸣般的喧嚣,浓烟和炽热的火焰,海上的战斗与现代战争一样.但那时,大炮 ...

  2. 二分算法题目训练(二)——Exams详解

    CodeForces732D——Exams 详解 Exam 题目描述(google翻译) Vasiliy的考试期限将持续n天.他必须通过m门科目的考试.受试者编号为1至m. 大约每天我们都知道当天可以 ...

  3. 二分算法题目训练(四)——Robin Hood详解

    codeforces672D——Robin Hood详解 Robin Hood 问题描述(google翻译) 我们都知道罗宾汉令人印象深刻的故事.罗宾汉利用他的射箭技巧和他的智慧从富人那里偷钱,然后把 ...

  4. Java进阶(三十二) HttpClient使用详解

    Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...

  5. SaltStack 入门到精通第三篇:Salt-Minion配置文件详解

    SaltStack 入门到精通第三篇:Salt-Minion配置文件详解 作者:ArlenJ  发布日期:2014-06-09 17:52:16   ##### 主要配置设置 ##### 配置 默认值 ...

  6. libsvm的安装,数据格式,常见错误,grid.py参数选择,c-SVC过程,libsvm参数解释,svm训练数据,libsvm的使用详解,SVM核函数的选择

    直接conda install libsvm安装的不完整,缺几个.py文件. 第一种安装方法: 下载:http://www.csie.ntu.edu.tw/~cjlin/cgi-bin/libsvm. ...

  7. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  8. java三篇博客转载 详解-vector,stack,queue,deque

    博客一:转载自http://shmilyaw-hotmail-com.iteye.com/blog/1825171 java stack的详细实现分析 简介 我们最常用的数据结构之一大概就是stack ...

  9. 三:python 对象类型详解一:数字(上)

    一:python 的数字类型: a)整数和浮点数 b)复数 c)固定精度的十进制数 d)有理分数 e)集合 f)布尔类型 g)无穷的整数精度 h)各种数字内置函数和模块 二:各种数字类型的详解 1,数 ...

随机推荐

  1. 如何判断当前修改过的datatable的某一列值是否为int型或double类型

    如何判断当前修改过的datatable的某一列值是否为int型或double类型 今天在做datatable数据验证时碰到要对datatable的列数据进行数据类型校验,因此记录一下本人校验的方法,如 ...

  2. iOS - 图片模糊效果实现

    下面给大家介绍图片模糊效果的三种方法 第一种使用Core Image进行模糊 - (UIImage *)blurryImage:(UIImage *)image withBlurLevel:(CGFl ...

  3. 【转载】C#编程中两个List集合使用Intersect方法求交集

    在C#语言程序设计中,List集合是常用的集合数据类型,在涉及集合类型的运算中,有时候我们需要计算2个List集合中共有的数据,即对2个List集合求交集运算.此时可以使用C#语言提供的Interse ...

  4. 预编译And作用域链

    首先要理解什么是预编译: 预编译就是在JS执行前的一瞬间创建一个AO对象,这个创建AO的过程叫做预编译. console.log(a) var a = 1; function c(b){ b = 10 ...

  5. [#Linux] CentOS 7 安装微信详细过程

    微信安装 微信安装过程如下: 1,下载最新版本tar.gz压缩包 wget https://github.com/geeeeeeeeek/electronic-wechat/releases/down ...

  6. Java反射中Class.forName和classloader的区别

    Java中Class.forName和classloader都可以用来对类进行加载. Class.forName除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块 ...

  7. 【原创】SPFA判负环

    [定义与概念] 给定一张有向图,若其中存在一个环的所有权值之和为负数,这个环称为负环. [算法实现] 当然,负环的求解可以暴搜,但是时间复杂度就难以入眼了,我们回到求解单源最短路径算法上面,看看它们能 ...

  8. .Net系列 Transaction 事务

    Transactions 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit).在计算机术语中,事务通常就是指数 ...

  9. SCOI2018 树

    树 时间限制 3000ms 内存限制 64MB [题目描述] 在大小为 N 的树上,点从 1 到 N 标号,第 i 个点有权值 Ai,现在需要支持两种操作: 第一种操作格式为"1 U&quo ...

  10. LG3690 【模板】Link Cut Tree 和 SDOI2008 洞穴勘测

    UPD:更新了写法. [模板]Link Cut Tree 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 后接两个整数(x,y),代表询问从x到y ...