Gadgets for dollars and pounds CodeForces - 609D
Nura wants to buy k gadgets. She has only sburles for that. She can buy each gadget for dollars or for pounds. So each gadget is selling only for some type of currency. The type of currency and the cost in that currency are not changing.
Nura can buy gadgets for n days. For each day you know the exchange rates of dollar and pound, so you know the cost of conversion burles to dollars or to pounds.
Each day (from 1 to n) Nura can buy some gadgets by current exchange rate. Each day she can buy any gadgets she wants, but each gadget can be bought no more than once during n days.
Help Nura to find the minimum day index when she will have k gadgets. Nura always pays with burles, which are converted according to the exchange rate of the purchase day. Nura can't buy dollars or pounds, she always stores only burles. Gadgets are numbered with integers from 1 to m in order of their appearing in input.
Input
First line contains four integers n, m, k, s (1 ≤ n ≤ 2·105, 1 ≤ k ≤ m ≤ 2·105, 1 ≤ s ≤ 109) — number of days, total number and required number of gadgets, number of burles Nura has.
Second line contains n integers ai (1 ≤ ai ≤ 106) — the cost of one dollar in burles on i-th day.
Third line contains n integers bi (1 ≤ bi ≤ 106) — the cost of one pound in burles on i-th day.
Each of the next m lines contains two integersti, ci (1 ≤ ti ≤ 2, 1 ≤ ci ≤ 106) — type of the gadget and it's cost. For the gadgets of the first type cost is specified in dollars. For the gadgets of the second type cost is specified in pounds.
Output
If Nura can't buy k gadgets print the only line with the number -1.
Otherwise the first line should contain integer d— the minimum day index, when Nura will have kgadgets. On each of the next k lines print two integers qi, di — the number of gadget and the day gadget should be bought. All values qi should be different, but the values di can coincide (so Nura can buy several gadgets at one day). The days are numbered from 1 to n.
In case there are multiple possible solutions, print any of them.
Example
5 4 2 2
1 2 3 2 1
3 2 1 2 3
1 1
2 1
1 2
2 2
3
1 1
2 3
4 3 2 200
69 70 71 72
104 105 106 107
1 1
2 2
1 2
-1
4 3 1 1000000000
900000 910000 940000 990000
990000 999000 999900 999990
1 87654
2 76543
1 65432
-1
有m种商品,可以购买,每种商品只能用美元或英镑二者其一购买
你现在有s元,既不是美元,也不是英镑,需要兑换才能购买
你需要买k种商品
你可以在n天里进行购买,每天的汇率不同,汇率告诉你
问你花费最少多少天,可以完成购买任务。
由于本人太菜这题是我写过的最难的二分 (靠题解才能存活的菜鸡)
(这题没有long long WA到吐)
对天数进行二分,am[maxn]这个对应着在1~maxn中兑换英镑的最小值ida[maxn],最小值对应的天数
am[maxn]这个对应着在1~maxn中兑换美元的最小值idb[maxn] 最小值对应的天数 求出每件物品的最小花费排序选出前k个就行了 这题需要理清思路 仔细思考
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
#define maxn 200010
int a[maxn],b[maxn],c[maxn],t[maxn];
int am[maxn],bm[maxn],ida[maxn],idb[maxn],id[maxn];
int n,m,k,s;
struct node
{
long long cost;
int idx;
}qu[maxn];
int cmp(node a,node b)
{
return a.cost<b.cost;
}
long long check(int x)
{
long long ans=;
for (int i= ;i<=m ;i++ ){
if (t[i]==) qu[i].cost=(long long)c[i]*(long long)am[x];
else qu[i].cost=(long long)c[i]*(long long)bm[x];
qu[i].idx=i;
}
sort(qu+,qu++m,cmp);
for (int i= ;i<=k ;i++)
ans+=qu[i].cost;
return ans;
}
int main() {
while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF){
am[]=bm[]=;
for (int i= ;i<=n ;i++){
scanf("%d",&a[i]);
if (a[i]<am[i-]) {
am[i]=a[i];
ida[i]=i;
}else {
am[i]=am[i-];
ida[i]=ida[i-];
}
}
for (int i= ; i<=n ; i++) {
scanf("%d",&b[i]);
if (b[i]<bm[i-]) {
bm[i]=b[i];
idb[i]=i;
} else {
bm[i]=bm[i-];
idb[i]=idb[i-];
}
}
for (int i= ;i<=m ;i++)
scanf("%d%d",&t[i],&c[i]);
long long r=n,l=,mid,d=-;
while(l<=r) {
mid=(l+r)/;
if (check(mid)<=s) {
r=mid-;
d=mid;
for (int i= ;i<=k ;i++){
id[i]=qu[i].idx;
}
}else l=mid+;
}
printf("%lld\n",d);
if(d==-) continue;
int x=d;
for (int i= ;i<=k ;i++){
printf("%d %d\n",id[i],t[id[i]]==?ida[x]:idb[x]);
}
}
return ;
}
Gadgets for dollars and pounds CodeForces - 609D的更多相关文章
- codeforces 609D D. Gadgets for dollars and pounds(二分+贪心)
题目链接: D. Gadgets for dollars and pounds time limit per test 2 seconds memory limit per test 256 mega ...
- Codeforces Educational Codeforces Round 3 D. Gadgets for dollars and pounds 二分,贪心
D. Gadgets for dollars and pounds 题目连接: http://www.codeforces.com/contest/609/problem/C Description ...
- CF# Educational Codeforces Round 3 D. Gadgets for dollars and pounds
D. Gadgets for dollars and pounds time limit per test 2 seconds memory limit per test 256 megabytes ...
- Educational Codeforces Round 3 D. Gadgets for dollars and pounds 二分+前缀
D. Gadgets for dollars and pounds time limit per test 2 seconds memory limit per test 256 megabytes ...
- CodeForces 609D Gadgets for dollars and pounds
二分天数+验证 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm&g ...
- CodeForce---Educational Codeforces Round 3 D. Gadgets for dollars and pounds 正题
对于这题笔者无解,只有手抄一份正解过来了: 基本思想就是 : 二分答案,对于第x天,计算它最少的花费f(x),<=s就是可行的,这是一个单调的函数,所以可以二分. 对于f(x)的计算,我用了nl ...
- Codeforces 609D 被二分教做人
传送门:http://codeforces.com/problemset/problem/609/D (如需转载,请注明出处,谢谢O(∩_∩)O) 题意: Nura想买k个小玩意,她手上有 s 个bu ...
- Educational Codeforces Round 3
A. USB Flash Drives 水题,排序即可 ]; int main() { int n,m; scanf("%d%d",&n,&m); ;i<n; ...
- 【249】◀▶IEW-Unit14
Unit 14 Money and Finance 线图写作技巧 1.Model1对应图片分析 The graph contains information about the price in US ...
随机推荐
- JAVAEE——BOS物流项目04:学习计划、datagrid、分页查询、批量删除、修改功能
1 学习计划 1.datagrid使用方法(重要) n 将静态HTML渲染为datagrid样式 n 发送ajax请求获取json数据创建datagrid n 使用easyUI提供的API创建data ...
- jq实现数字增加或者减少的动画
效果图: 1.HTML: <div class="up"></div> <br> <div class="down"& ...
- 拥抱.NET Core系列:MemoryCache 初识
Cache是一个绝大多数项目会用到的一个技术,说起到缓存可能就联想到 Set.Add.Get.Remove.Clear 这几个方法.那么在.NET Core中微软给我们带来了什么样的缓存体验呢?今天我 ...
- MySQL数据库基础(四)(子查询与链接)
1.子查询简介 其中,所谓的"外层查询"并不是指"查找",指的是所有SQL语句的统称:结构化查询语言(Structured Query Language),简称 ...
- 基于JDK1.8的ArrayList剖析
前言 本文是基于JDK1.8的ArrayList进行分析的.本文大概从以下几个方面来分析ArrayList这个数据结构 构造方法 add方法 扩容 remove方法 (一)构造方法 /** * Con ...
- 1.10 tuple 元组
元组(tuple)属于不可变序列 tuple特性: 特性一:可包含任意对象的有序集合 特性二:通过下标索引访问元素 特性三:固定长度,异质,可任意嵌套 特性四:不支持原位改变 特性五:存储机制:对象引 ...
- 【CF 678F】Lena and Queries
Time Limit: 2000 ms Memory Limit: 512 MB Description 初始有一个空集合 n个操作 有三种操作,如下: 1 a b 表示向集合中插入二元组(a,b ...
- Fantasia (Tarjan+树形DP)
Time Limit: 1000 ms Memory Limit: 256 MB Description 给定一张N个点.M条边的无向图 $G$ .每个点有个权值Wi. 我们定义 $G_i$ 为图 ...
- Springdata mongodb 版本兼容 引起 Error [The 'cursor' option is required, except for aggregate with the explain argument
在Spring data mongodb 中使用聚合抛出异常 mongodb版本 为 3.6 org.springframework.dao.InvalidDataAccessApiUsageExce ...
- 情景linux--如何优雅地退出telnet
情景linux--在脚本中如何优雅地退出telnet 情景 telnet命令是TELNET协议的用户接口,它支持两种模式:命令模式和会话模式.虽然telnet支持许多命令,但大部分情况下,我们只是使用 ...