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. HTML5 Canvas 自定义笔刷

    1. [图片] QQ截图20120715095110.png ​​2. [代码][HTML]代码 <!DOCTYPE html><html lang="en" & ...

  2. Java网络编程InetAddress类

    InetAddress用来代表IP地址.一个InetAdress的对象就代表着一个IP地址, getByName(String host):在给定主机名的情况下确定主机的 IP 地址,主机名可以是机器 ...

  3. Android终端管理器删除文件夹

    终端管理器删除文件夹不能用网上提供的: rm -rf 文件夹名 而要用: rm -r 文件夹名. http://blog.csdn.net/enhancing/article/details/8490 ...

  4. js跳转方式 【转】

    第一种:    <script language="javascript" type="text/javascript">           wi ...

  5. 「AHOI2008」「LuoguP4281」紧急集合 / 聚会(LCA

    题目描述 欢乐岛上有个非常好玩的游戏,叫做“紧急集合”.在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等待点,通过道路从一个点到另一个点要 ...

  6. Exception in thread “main” java.sql.SQLException: The server time zone value ‘�й���׼ʱ��’ is unrecognized or represents more than one time zone.

    Exception in thread “main” java.sql.SQLException: The server time zone value ‘�й���׼ʱ��’ is unrecogn ...

  7. HDU2896(AC自动机入门题)

    病毒侵袭 Time Limit:1000MS     Memory Limit:32768KB   Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这 ...

  8. Httpclient: 多层翻页网络爬虫实战(以搜房网为例)

    参考:http://blog.csdn.net/qy20115549/article/details/52912532 一.创建数据表 #创建表:用来存储url地址信息 create table so ...

  9. mysql 快捷键

    1.ctrl+q           打开查询窗口2.ctrl+/            注释sql语句3.ctrl+shift +/  解除注释4.ctrl+r           运行查询窗口的s ...

  10. 4-1数据类型转换的基本概念 & 4-2 & 4-3数据类型转换案例 & 4-4习题

    4-1数据类型转换的基本概念 253是int类型的,赋值给长整型的n 这种就是强制的类型转换 自动类型转换又叫做饮食类型转换,因为他的转换我们是看不到的 实线表示无数据丢失的 虚线在转换时, doub ...