• 2018QBXT刷题游记(19)


    【2018QBXT刷题游记】

    Day5 TEST7

    T1 herb

    【问题描述】
    小奇是只天资聪颖的喵,他的梦想是成为世界上最伟大的医师。
    为此,他想拜喵星球最有威望的医师为师。
    医师为了判断他的资质,给他出了一个难题。
    医师把他带到⼀个到处都是草药的山洞里对他说:“小奇,这个山洞里有一些不同的草药,采每⼀株都需要⼀些时间,每⼀株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到⼀些草药。
    如果你是一只聪明的喵,你应该可以让采到的草药的总价值最大。”
    【输入格式】
    输入文件名为 herb.in
    第 1 行包括 1 个整数 T,表示数据组数。
    对于每组数据,第 1 行包括 2 个整数, n, m,表示草药的数目和能用于采
    药的时间。
    接下来 n 行,每行两个整数 ti;vi。
    保证 m;ti;vi 在限制范围内均匀随机生成。
    【输出格式】
    输出文件名为 herb.out
    输出 T 组,每组 1 个数字,表示每组数据答案。
    【样例输入】
    1
    3 70
    71 100
    69 1
    1 2
    【样例输出】
    3
    【数据规模与约定】
    对于 30% 数据, 1n20;1mviti1041 ≤ n ≤ 20; 1 ≤ m,vi,ti ≤ 10^4
    对于 60% 数据, 1n100;1mviti1051 ≤ n ≤ 100; 1 ≤ m,vi,ti ≤ 10^5
    对于 100% 数据, 1T10;1n150;1mviti1091 ≤ T ≤ 10; 1 ≤ n ≤ 150; 1 ≤ m,vi,ti ≤ 10^9

    【分析】60分就是01背包模板
    然鹅100分数据范围有点大。
    考虑到m,ti,vi 在限制范围内均匀随机生成,那么不会选太多的草药,耗时较少的草药有很大概率存在于最优解中。
    针对这些性质优化搜索。

    #include<queue>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #define ll long long
    #define inf 1000000000
    using namespace std;
    inline int read()
    {
        int 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;
    }
    int n,m;
    ll ans;
    ll sw[205],sv[205];
    struct data{
        int w,val; 
    }a[205];
    bool operator<(data a,data b)
    {
        return a.w>b.w;
    }
    void dfs(int x,ll sumw,ll sumv)
    {
        ans=max(ans,sumv);
        if(sumw+a[n].w>m)return;
        if(sumv+sv[x]<ans)return;
        if(sumw+sw[x]<=m)
        {
            ans=max(ans,sumv+sv[x]);
            return;
        }
        if(sumw+a[x].w<m)
            dfs(x+1,sumw+a[x].w,sumv+a[x].val);
        dfs(x+1,sumw,sumv);
    }
    int main()
    {
        freopen("herb.in","r",stdin);
        freopen("herb.out","w",stdout);
        int T=read();
        while(T--)
        {
            n=read();m=read();
            ans=0;
            for(int i=1;i<=n;i++)
                a[i].w=read(),a[i].val=read();
            sort(a+1,a+n+1);
            sw[n+1]=sv[n+1]=0;
            for(int i=n;i>=1;i--)
            {
                sw[i]=sw[i+1]+a[i].w;
                sv[i]=sv[i+1]+a[i].val;
            }
            dfs(1,0,0);
            cout<<ans<<endl;
        }
        return 0;
    }
    
    
  • 相关阅读:
    Codeforces Round #258 (Div. 2) D. Count Good Substrings —— 组合数学
    Codeforces Round #394 (Div. 2) C. Dasha and Password —— 枚举
    Codeforces Round #394 (Div. 2) B. Dasha and friends —— 暴力 or 最小表示法
    Codeforces Beta Round #7 D. Palindrome Degree —— 字符串哈希
    VK Cup 2012 Qualification Round 1 E. Phone Talks —— DP
    Codeforces Beta Round #88 C. Cycle —— DFS(找环)
    Codeforces Round #178 (Div. 2) B. Shaass and Bookshelf —— DP
    VK Cup 2015
    Codeforces Round #173 (Div. 2) E. Sausage Maximization —— 字典树 + 前缀和
    python模块--ip地址转换为整数
  • 原文地址:https://www.cnblogs.com/erutsiom/p/9905136.html
Copyright © 2020-2023  润新知