http://codeforces.com/contest/734/problem/C

因为有两种操作,那么可以这样考虑,

1、都不执行,就是开始的答案是n * x

2、先执行第一个操作,然后就会得到一个time和left。就是你会得到一个新的用时,和一个剩下的魔法数,然后在第二个操作数中二分,二分第一个小于等于left的值,意思就是我现在还拥有left点魔法,能够买最多多少个技能的意思。

就是,看着样例一

得到的会是

time : 40s    80s  60s

left   : 79  89   59

3、同理,可以先执行第二种操作,再执行第一种操作。这就需要我们把第一种操作的东西排序了。这里用到了贪心,排序第一是按照需要的魔法数来排,第二是按照a[i]从大到小。(这里又fst,唉,一个符号)。因为这样是最优的。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = 1e6 + ;
LL a[maxn];
LL b[maxn];
struct node {
LL c, d;
node(LL cc, LL dd) : c(cc), d(dd) {}
node() {}
bool operator < (const struct node & rhs) const {
return d < rhs.d;
}
}arr[maxn];
struct tt {
LL tim, lef;
LL id;
}ff[maxn];
struct bug {
LL a, b;
int id;
bug() {}
bug(LL aa, LL bb) : a(aa), b(bb) {}
bool operator < (const struct bug & rhs) const {
if (b != rhs.b) return b < rhs.b;
else return a > rhs.a; //这个按大排
}
}gg[maxn];
void work() {
LL n, m, k;
cin >> n >> m >> k;
LL x, limit;
cin >> x >> limit;
for (int i = ; i <= m; ++i) {
cin >> a[i];
gg[i].a = a[i];
}
for (int i = ; i <= m; ++i) {
cin >> b[i];
gg[i].b = b[i];
gg[i].id = i;
}
sort(gg + , gg + + m);
for (int i = ; i <= k; ++i) {
cin >> arr[i].c;
}
for (int i = ; i <= k; ++i) {
cin >> arr[i].d;
}
LL ans = n * x;
int lenff = ;
// cout << x << endl;
for (int i = ; i <= m; ++i) {
if (b[i] > limit) continue;
++lenff;
ff[lenff].tim = n * a[i];
ff[lenff].lef = limit - b[i];
ff[lenff].id = i;
}
// for (int i = 1; i <= lenff; ++i) {
// cout << ff[i].tim << " " << ff[i].lef << endl;
// }
for (int i = ; i <= lenff; ++i) {
ans = min(ans, ff[i].tim);
if (ff[i].lef < arr[].d) continue;
int pos = upper_bound(arr + , arr + + k, node(0L, ff[i].lef)) - arr;
pos--;
LL t = ff[i].tim - arr[pos].c * a[ff[i].id];
ans = min(ans, t);
}
lenff = ;
for (int i = ; i <= k; ++i) {
if (arr[i].d > limit) continue;
++lenff;
ff[lenff].lef = limit - arr[i].d;
ff[lenff].tim = (n - arr[i].c) * x;
ff[lenff].id = n - arr[i].c;
}
for (int i = ; i <= lenff; ++i) {
ans = min(ans, ff[i].tim);
if (ff[i].lef < gg[].b) continue;
int pos = upper_bound(gg + , gg + + m, bug(, ff[i].lef)) - gg;
pos--;
LL t = ff[i].id * a[gg[pos].id];
ans = min(ans, t);
}
cout << ans << endl;
} int main() {
#ifdef local
freopen("data.txt","r",stdin);
#endif
IOS;
work();
return ;
}

C. Anton and Making Potions 贪心 + 二分的更多相关文章

  1. Codeforces Round #379 (Div. 2) C. Anton and Making Potions 枚举+二分

    C. Anton and Making Potions 题目连接: http://codeforces.com/contest/734/problem/C Description Anton is p ...

  2. Codeforces 734C Anton and Making Potions(枚举+二分)

    题目链接:http://codeforces.com/problemset/problem/734/C 题目大意:要制作n个药,初始制作一个药的时间为x,魔力值为s,有两类咒语,第一类周瑜有m种,每种 ...

  3. CodeForce-734C Anton and Making Potions(贪心+二分)

    CodeForce-734C Anton and Making Potions  C. Anton and Making Potions time limit per test 4 seconds m ...

  4. Codeforces Round #379 (Div. 2) C. Anton and Making Potions 二分

    C. Anton and Making Potions time limit per test 4 seconds memory limit per test 256 megabytes input ...

  5. Codeforces Round #379 (Div. 2) C. Anton and Making Potions —— 二分

    题目链接:http://codeforces.com/contest/734/problem/C C. Anton and Making Potions time limit per test 4 s ...

  6. 二分算法题目训练(三)——Anton and Making Potions详解

    codeforces734C——Anton and Making Potions详解 Anton and Making Potions 题目描述(google翻译) 安东正在玩一个非常有趣的电脑游戏, ...

  7. [二分] Codefoces Anton and Making Potions

    Anton and Making Potions time limit per test 4 seconds memory limit per test 256 megabytes input sta ...

  8. Anton and Making Potions

    Anton and Making Potions time limit per test 4 seconds memory limit per test 256 megabytes input sta ...

  9. poj 2782 Bin Packing (贪心+二分)

    F - 贪心+ 二分 Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu   Description ...

随机推荐

  1. Android-利用LinearGradient实现文字一闪一闪

    效果如下图所示: 具体实现方式如下: 1,自定义一个LinearGradientTextView 继承 TextView ,重写onSizeChanged和onDraw.: public class ...

  2. C#开发遇到的常见问题及知识点

    今天遇到的类型初始值设定项引发异常的原因是:类没有添加[Serializable]属性. this.DialogResult = System.Windows.Forms.DialogResult.O ...

  3. CISCO-路由器交换机IOS被删,恢复方法

    方式一,tftpdnld方式恢复Router 2600 IOS 1) 将计算机串口和路由器console口相连 一定将计算机网口与路由器第一个以太口f0/0相连. 2) 启动TFTP服务器,并将要下载 ...

  4. npm 引入第三方过滤器

    根据项目具体情况使用过滤器,如果不满足业务需求可以在vue的全局或者局部自定义fiter(过滤器) 一下是github提供的第三方过滤器: https://github.com/freearhey/v ...

  5. mysql 入门 1

    连接mysql服务器 mysql -h localhost -u username -ppasswd 1.查看服务器存在的库 show databases; 2.创建数据库 create databa ...

  6. 配置web应用

    web应用配置虚拟主机1.web应用的虚拟路径映射,就是web应用的真实存在的路径配置一个虚拟路径 在conf目录下的Server.xml 的<Host>标签中,配置<Context ...

  7. 3.清除dns缓存的意义及命令?

    1.dos命令:ipconfig /flushdns 2.意义: 简单地说就是 www.baidu.com ,www.sina.com 这些就是DNS域名.但是计算机不能直接通过DNS域名访问服务器( ...

  8. no more URLs to fetch

    Generator: records selected for fetching, exiting ... Stopping at depth= - no more URLs to fetch. 出现 ...

  9. linux中的条件变量

    1 大家可能知道互斥量是线程程序中必须的工具了,但是也不能是万能的,就比如某个线程正在等待共享数据某个条件的发生,这个时候会发生什么呢.它就可能重复的尝试对互斥对象锁定和解锁来检查共享数据结构. 2 ...

  10. 微信小程序开发之页面跳转并携带参数

    接口: wx.navigateTo({url:......})   保留当前页面,跳转到应用内指定URL页面,导航栏左上角有返回按钮 wx.redirecTo({url:.....})       关 ...