Codeforces 609D Gadgets for dollars and pounds

来源:互联网 发布:如何批量注册淘宝小号 编辑:程序博客网 时间:2024/04/29 02:30

题意:

一共有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_pairconst 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;}
0 0
原创粉丝点击