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<<" ";
    }
    
    
  • 相关阅读:
    ArrayList和CopyOnWriteArrayList
    UML类关系
    Vmware下mint os的安装
    Java VisualVM无法检测到本地java程序 的 解决办法
    谜之闭包
    虚拟DOM(Virtual DOM)
    ES6箭头函数与普通函数的区别
    HTML中 select 与datalist的异同
    备战前端面试
    javascript获取数组中的最大值/最小值
  • 原文地址:https://www.cnblogs.com/mollnn/p/12293112.html
Copyright © 2011-2022 走看看