Codeforces 609D Gadgets for dollars and pounds
2015-12-27 18:08
399 查看
题意:
一共有n个物品,只能用英镑或者美元购买,Nura只有s元钱想买k个物品。给出每天的英镑和美元的汇率,问Nura可以买够k个物品的最短天数。分析:
将物品根据美元和英镑分为两类,分别进行排序。因为每天可以买任意数量的不同物品,所以如果该天汇率比前一天大,则可以在前一天就买了这个物品。所以在预处理时,将该天的汇率更新为该天之前的最小概率。通过每天的新汇率计算出相应的转换后的钱数,将前k小的物品价钱求和并与s进行比较。最后在用二分查找获取满足条件的最小天数,若该天满足条件,就看更早的时候是否满足,否则在之后的天数进行查找。代码:
#include<cstdio> #include<cmath> #include<iostream> #include<cstring> #include<algorithm> using namespace std; #define rep(i,a,n) for(int i =(a); i < (n); i++) #define fi first #define se second #define mp make_pair const int maxn=200005; const int INF=0x3fffffff; int a[maxn],b[maxn]; pair<long long ,int >p1[maxn]; pair<long long ,int>p2[maxn]; int x[1000005],y[1000005]; int t[3][1000005]; int n,m,k1; long long s,temp1,temp2; int cj ,ck ; int f(int day) { cj = 0, ck = 0; long long cnt = 0; rep(i, 0, k1){ temp1 = p1[cj].fi* a[day]; temp2 = p2[ck].fi * b[day]; if(temp1 <= temp2) {cnt += temp1; cj++;} else {cnt += temp2; ck++;} if(cnt > s) return 0; } return 1; } int main (void) { int j = 1, k = 1; int aa; long long bb; a[0] = b[0] = INF; cin>>n>>m>>k1>>s; rep(i,1,n+1) { cin>>a[i]; if(a[i] >= a[i-1]) a[i] = a[i-1]; else x[a[i]] = i; }//dollar rep(i,1,n+1){ cin>>b[i]; if(b[i] >= b[i-1]) b[i] = b[i-1]; else y[b[i]] = i; }//pound rep(i,1,m+1) { cin>>aa>>bb; if(aa == 1){p1[k++] = mp(bb,i);} else {p2[j++] = mp(bb,i); } } p1[0].fi = p2[0].fi = INF; sort(p1,p1+k); sort(p2,p2+j); int l = 1,r = n+1, mid; while(l < r){ mid = (l+r)/2; if(f(mid)) r = mid; else l = mid+1; } if(l == n+1) cout<<"-1"<<endl; else { cout<<l<<endl; cj = 0, ck = 0; rep(i, 0, k1){//fi 价钱 se 号码 temp1 = p1[cj].fi * a[l]; temp2 = p2[ck].fi * b[l]; if(temp1 <= temp2) cout<<p1[cj++].se<<' '<<x[a[l]]<<endl; else cout<<p2[ck++].se<<' '<<y[b[l]]<<endl; } } return 0; }
相关文章推荐
- Android singleTask或singleInstance与startActivityForResult冲突解决
- 可重入函数与不可重入函数
- SpringMVC List绑定
- 【oracle】使用oracle常见错误汇总
- AIDL服务(跨进程访问)
- node.js之打包工具webpack
- STM32 KEIL下的堆栈设置
- 顺序表和链表
- linux(CentOS)之postfix服务器sasl认证和基于cyrus-sasl访问控制
- swift 基础2
- NoSQL数据库和oracle数据库等一些问题的收集
- Android之使用递归删除文件或文件夹
- iOS ---oc和js交互2
- Android 应用程序窗口显示状态操作(requestWindowFeature()的应用)
- Java API —— 递归
- C#学习笔记007-字符串练习
- My97DatePicker时间控件
- android 系统短信数据库的查询与删除
- Hadoop集群完全分布式搭建教程-CentOS
- java.util.List源码分析