• 【11.4 测试】Market


    Input file: market.in
    Output file: market.out
    Time limit: 1 seconds
    Memory limit: 128 megabytes
    在比特镇一共有 n 家商店,编号依次为 1 到 n。每家商店只会卖一种物品,其中第 i 家商店的物品单价为 ci,价值为 vi,且该商店开张的时间为 ti。
    Byteasar 计划进行 m 次购物,其中第 i 次购物的时间为 Ti,预算为 Mi。每次购物的时候, Byteasar会在每家商店购买最多一件物品,当然他也可以选择什么都不买。如果购物的时间早于商店开张的时间,那么显然他无法在这家商店进行购物。现在 Byteasar 想知道,对于每个计划,他最多能购入总价值多少的物品。请写一个程序,帮助Byteasar 合理安排购物计划。
    注意:每次所花金额不得超过预算,预算也不一定要花完,同时预算不能留给其它计划使用。
    Input
    第一行包含两个正整数 n; m,表示商店的总数和计划购物的次数。
    接下来 n 行,每行三个正整数 ci; vi; ti,分别表示每家商店的单价、价值以及开张时间。
    接下来 m 行,每行两个正整数 Ti; Mi,分别表示每个购物计划的时间和预算。
    Output
    输出 m 行,每行一个整数,对于每个计划输出最大可能的价值和。
    Examples

    market.in market.out
    5 2
    5 5 4
    1 3 1
    3 4 3
    6 2 2
    4 3 2
    3 8
    5 9
    10
    12

    第一个计划可以在商店 2,3,5 各购买一件物品,总花费为 1 + 3 + 4 = 8,总价值为 3 + 4 + 3 = 10。
    第二个计划可以在商店 1,2,3 各购买一件物品,总花费为 5 + 1 + 3 = 9,总价值为 5 + 3 + 4 = 12。

    Notes
    对于 100% 的数据, 1 ≤ ti; Ti ≤ n。

    测试点编号 n m ci; Mi vi ti; Ti
    1 = 10 = 5 ≤ 10 ≤ 10 ≤ 10
    2 = 20 = 10 ≤ 100 ≤ 100 ≤ 20
    3 = 100 = 1 ≤ 100 ≤ 100 = 1
    4 = 200 = 1 ≤ 200 ≤ 200 = 1
    5 = 150 = 100000 ≤ 150 ≤ 150 ≤ 150
    6 = 300 = 100000 ≤ 300 ≤ 300 ≤ 300
    7 = 20 = 100000 ≤ 109 ≤ 300 ≤ 20
    8 = 200 = 100000 ≤ 109 ≤ 200 ≤ 200
    9 = 300 = 100000 ≤ 109 ≤ 300 ≤ 300
    10 = 300 = 100000 ≤ 109 ≤ 300 ≤ 300

     

    题解:这道题01背包优化,注意用二分(因为他有单调性啊qwq)

             安利一下,这篇题解特别棒 https://blog.csdn.net/wu_tongtong/article/details/75305310

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<queue>
    using namespace std;
    typedef long long ll;
    const int N=501;
    int n,m;
    struct node{
        int c,v,t;
    }e[N];
    int T,M,mx=0;
    ll f[N*N];  
    struct data{
        int t,m,id,ed;
    }q[1000010];
    int ans[1000010]; 
    
    int cmp(node a,node b){
        if (a.t!=b.t) return a.t<b.t;
        else return a.c>b.c;
    }
    int cmp2(data a,data b){ 
        if (a.ed!=b.ed) return a.ed<b.ed;
        else return a.m>b.m;
    }
    
    int fathest(int x){ //记录一下每个询问可以最远去哪个商店购买
        int l=1,r=n;
        int ans=0;        
        while (l<=r){ 
            int mid=(l+r)>>1;
            if (e[mid].t<=x) ans=max(ans,mid),l=mid+1;
            else r=mid-1;
        }
        return ans;
    }
    
    void ido_ycll(){
        int k=1;
        while ( !q[k].ed && k<=m) k++;  //一个商店也去不了,这种询问跳过 
        memset(f,0x3f,sizeof(f));
        f[0]=0;
        for(int i=1;i<=n;i++){
            for(int j=mx;j>=e[i].v;j--)  
                f[j]=min(f[j],f[j-e[i].v]+(ll)e[i].c);
            int last=mx;
            while(q[k].ed==i && k<=m){ 
                for (int s=last;s>=1;s--)
                    if (f[s]<=q[k].m)   
                       { ans[q[k].id]=s; last=s; break; }
                k++;
            } 
        }
    }
    
    int main()
    {
        freopen("market.in","r",stdin);  
        freopen("market.out","w",stdout);
        scanf("%d%d",&n,&m);
        for (int i=1;i<=n;i++){
            scanf("%d %d %d",&e[i].c,&e[i].v,&e[i].t);
            mx+=e[i].v;
        }
        sort(e+1,e+1+n,cmp);
        for (int i=1;i<=m;i++){
            scanf("%d %d",&q[i].t,&q[i].m);
            q[i].id=i;
        }
        for (int i=1;i<=m;i++)
            q[i].ed=fathest(q[i].t);//最远能去的那个商店的编号 
        sort(q+1,q+1+m,cmp2);
        ido_ycll();
        for (int i=1;i<=m;i++)
            printf("%d
    ",ans[i]);
        return 0;
    }
  • 相关阅读:
    el-cascader回显问题
    nuxt + ueditor国际化
    nuxt + element + i18n 国际化element(我用的i18n@8.x版本)
    CDH| 组件的使用-Flume| Kafka| Oozie基于Hue的任务调度
    CDH| Hive| Hue| Sqoop| Impala等组件安装部署
    CDH| 组件的安装-HDFS的配置 | Flume| Kafka|
    Flink| 实时需要分析
    Flink| 状态一致性
    Flink| 容错机制
    Flink| 第一个窗口触发时间
  • 原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11792952.html
Copyright © 2020-2023  润新知