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
Nura wants to buy k gadgets. She has only s burles 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 integers ti, 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 k gadgets. 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.
Sample Input
5 4 2 2
1 2 3 2 1
3 2 1 2 3
1 1
2 1
1 2
2 2
Sample Output
3
1 1
2 3
Hint
题意
有n天,一共有m个物品,你需要买k个,你身上有s元人民币。每一天,人民币兑换美元的价格为a[i],兑换英镑的价格为b[i]。
购买第i种物品,必须要用c[i]块t[i]货币来购买。然后问你最少多少天之内,可以买够t个物品,并且输出哪一天买哪一个物品。
题解:
二分答案。二分天数,很显然我们在这一个范围内,我们在这个范围内兑换美元和英镑最便宜的时候购买,物品则是兑换钱的时候买,然后check花费是否大于s就好了。
代码
#include<bits/stdc++.h>
using namespace std;
inline long long read()
{
long long x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
#define maxn 200005
int n,m,k;
int s;
int Mia[maxn],Mib[maxn];
int a[maxn],b[maxn];
long long suma[maxn],sumb[maxn];
int pm1[maxn],pm2[maxn];
vector<pair<int,int> > c1,c2;
int check(int mid)
{
long long mi = 1e18;
int top = min(k,(int)c1.size()-1);
for(int i=0;i<=top;i++)
{
int i1 = i;
int i2 = k-i;
if(i2>=c2.size())continue;
mi = min(mi,1LL*suma[i1]*Mia[mid]+1LL*sumb[i2]*Mib[mid]);
}
if(mi>s)return 0;
return 1;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&k,&s);
Mia[0]=1e18;Mib[0]=1e18;
for(int i=1;i<=n;i++)
{
a[i]=read();
Mia[i]=min(a[i],Mia[i-1]);
if(a[i]>=Mia[i-1])pm1[i]=pm1[i-1];
else pm1[i]=i;
}
for(int i=1;i<=n;i++)
{
b[i]=read();
Mib[i]=min(b[i],Mib[i-1]);
if(b[i]>=Mib[i-1])pm2[i]=pm2[i-1];
else pm2[i]=i;
}
Mia[0]=0;Mib[0]=0;
for(int i=1;i<=m;i++)
{
int t,c;
t=read(),c=read();
if(t==1)c1.push_back(make_pair(c,i));
else c2.push_back(make_pair(c,i));
}
c1.push_back(make_pair(0,0));
c2.push_back(make_pair(0,0));
sort(c1.begin(),c1.end());
sort(c2.begin(),c2.end());
for(int i=1;i<c1.size();i++)
suma[i]=c1[i].first+suma[i-1];
for(int i=0;i<c2.size();i++)
sumb[i]=c2[i].first+sumb[i-1];
int l = 1,r = n+1;
while(l<=r)
{
int mid = (l+r)/2;
if(check(mid))r=mid-1;
else l=mid+1;
}
if(l>=n+1)return puts("-1");
printf("%d\n",l);
long long mi = 1e18;
int top = min(k,(int)c1.size()-1);
for(int i=0;i<=top;i++)
{
int i1 = i;
int i2 = k-i;
if(i2>=c2.size())continue;
mi = min(mi,1LL*suma[i1]*Mia[l]+1LL*sumb[i2]*Mib[l]);
}
for(int i=0;i<=top;i++)
{
int i1 = i;
int i2 = k-i;
if(i2>=c2.size())continue;
if(suma[i1]*Mia[l]+sumb[i2]*Mib[l]==mi)
{
for(int j=1;j<=i1;j++)
printf("%d %d\n",c1[j].second,pm1[l]);
for(int j=1;j<=i2;j++)
printf("%d %d\n",c2[j].second,pm2[l]);
return 0;
}
}
}
Codeforces Educational Codeforces Round 3 D. Gadgets for dollars and pounds 二分,贪心的更多相关文章
- 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 D. Gadgets for dollars and pounds(二分+贪心)
题目链接: D. Gadgets for dollars and pounds time limit per test 2 seconds memory limit per test 256 mega ...
- 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 ...
- CodeForce---Educational Codeforces Round 3 D. Gadgets for dollars and pounds 正题
对于这题笔者无解,只有手抄一份正解过来了: 基本思想就是 : 二分答案,对于第x天,计算它最少的花费f(x),<=s就是可行的,这是一个单调的函数,所以可以二分. 对于f(x)的计算,我用了nl ...
- Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings
Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...
- Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes
Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes 题目连接: http://code ...
- 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 f ...
- codeforces Educational Codeforces Round 5 A. Comparing Two Long Integers
题目链接:http://codeforces.com/problemset/problem/616/A 题目意思:顾名思义,就是比较两个长度不超过 1e6 的字符串的大小 模拟即可.提供两个版本,数组 ...
- codeforces Educational Codeforces Round 16-E(DP)
题目链接:http://codeforces.com/contest/710/problem/E 题意:开始文本为空,可以选择话费时间x输入或删除一个字符,也可以选择复制并粘贴一串字符(即长度变为两倍 ...
随机推荐
- Appium过程中用到的adb点滴知识库
一.认识abd adb是什么? adb的全称为Android Debug Bridge,就是起到调试桥的作用.通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是d ...
- Shapefile文件中的坐标绘制到屏幕时的映射模式设置
pDC->SetMapMode(MM_ANISOTROPIC ); //首先选择MM_ANISOTROPIC映射模式,其它映射模式都不合适 pDC->SetWindowExt( max(a ...
- cJSON学习笔记
1.JSON格式简述 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成.它基于JavaScript(Standa ...
- 15+ 易响应的CSS框架快速开启你的敏捷网站项目
由 于移动互联用户的快速增加,现在数量已经超出10亿,几乎可以肯定的是你的网站每天都会有移动用户访问.如果你组织计划创建一个对移动用户友好的浏览体 验,有多个方面需要考虑.响应快速的网站设计似乎现在很 ...
- ninject学习笔记一:IOC的实现
这篇文章主要介绍ninject在IOC方面的实现,至于IOC的含义,网络资源很丰富,我这儿就不再赘述了.官方的文档其实挺好的,只是本人英语很烂,看起来比较费劲,下面这些东西是看官方的代码推敲的,我觉得 ...
- linux下设置SSH无密码登陆
SSH配置 主机cloudgis22.edu.cn:192.168.3.21 主机cloudgis33.edu.cn:192.168.2.174 假设需要配置主机A无密码登录主机A,主机B,先确保所有 ...
- 数据库 CHECKDB 发现了x个分配错误和 x 个一致性错误
--1.在SQL查询分析器中执行以下语句:(注以下所用的POS为数据库名称,请用户手工改为自己的数据库名) use pos dbcc checkdb --2.查看查询结果,有很多红色字体显示,最后结果 ...
- 2016 ACM/ICPC 沈阳站 小结
铜铜铜…… 人呐真奇怪 铁牌水平总想着运气好拿个铜 铜牌水平总想着运气好拿个银 估计银牌的聚聚们一定也不满意 想拿个金吧 这次比赛挺不爽的 AB两道SB题,十分钟基本全场都过了 不知道出这种题有什么意 ...
- 转】使用kaptcha生成验证码
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4221848.html 感谢! kaptcha是一个简单好用的验证码生成工具,通过配置,可以自己定义验证码大小.颜 ...
- 异步编程之Promise(3):拓展进阶
异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...