zoukankan      html  css  js  c++  java
  • [CF3B] Lorry

    有一辆载重量为 v 的货车, 准备运送两种物品。 物品 A 的重量为 1, 物体 B 的重量为 2, 每个物品都有一个价值。 求货车可以运送的物品的最大价值。

    Solution

    考虑把物品分为两类,枚举 B 类选多少个,考虑到每一类中一定会优先选择价值最高的那些,排序即可

    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    int n,v,p,q,ans,ans2,ans3,c[200005],d[200005];
    vector <pair<int,int> > a,b;
    
    signed main() {
        ios::sync_with_stdio(false);
        cin>>n>>v;
        for(int i=1;i<=n;i++) {
            cin>>p>>q;
            if(p==1) a.push_back(make_pair(q,i));
            if(p==2) b.push_back(make_pair(q,i));
        }
        sort(a.rbegin(),a.rend());
        sort(b.rbegin(),b.rend());
        for(int i=1;i<a.size();i++) a[i].first+=a[i-1].first;
        for(int i=1;i<b.size();i++) b[i].first+=b[i-1].first;
        for(int i=1;i<=a.size();i++) c[i]=a[i-1].first;
        for(int i=a.size()+1;i<=n;i++) c[i]=c[a.size()];
        for(int i=1;i<=b.size();i++) d[i]=b[i-1].first;
        for(int i=0;i<=b.size();i++) {
            int tmp=d[i]+c[v-i*2];
            if(ans<tmp) {
                ans=tmp;
                ans2=i;
                ans3=min((int)(a.size()),min(n*2,v-i*2));
            }
        }
        cout<<ans<<endl;
        for(int i=0;i<ans2;i++) cout<<b[i].second<<" ";
        for(int i=0;i<ans3;i++) cout<<a[i].second<<" ";
    }
    
    
  • 相关阅读:
    windows 物理内存获取
    windbg-.process切换进程(内核)
    cnetos 6.7彻底解决vmware NAT网络问题
    优秀的博客链接地址
    使用Spring MVC统一异常处理实战
    active mq 配置
    socket demo程序
    flume 中的 hdfs sink round 和roll
    软链接与硬链接
    flume A simple example
  • 原文地址:https://www.cnblogs.com/mollnn/p/12293112.html
Copyright © 2011-2022 走看看