zoukankan      html  css  js  c++  java
  • Codeforces 609D Gadgets for dollars and pounds

    题意:

    一共有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;
    }
    
  • 相关阅读:
    php 图形用户界面GUI 开发
    centos实现两种秒级任务的简单方法
    rsync同步工具的配置与使用
    【转】网络字节序与主机字节序
    【转】Visual Studio 非常实用的调试技巧
    【原/转】【boost】智能指针使用规则以及介绍
    【转】一个非常常见但容易被忽略的c++问题——用IPML模式可以解决
    【转】Visual Studio项目相对路径的设置,实用
    【原】visual studio添加现有文件夹的方法
    【原】自定义UINavigationItem的两种方法以及相应的隐藏方法
  • 原文地址:https://www.cnblogs.com/Tuesdayzz/p/5758854.html
Copyright © 2011-2022 走看看