CodeForces 3B-Lorry

去他喵的dp,去他喵的贪心,直接暴力就完事了

先对两种分别从大到小排序

然后枚举选了几个体积为1的,选的这些肯定是价值最大的那些,用前缀和就完事了,枚举了体积为1的个数体积为2的个数自然就知道了,再加上他们的价值就是总价值

#include<bits/stdc++.h>
using namespace std;
const int N=100000+10;
struct S1
{
    int id;
    int v;
}s1[N];
struct S2
{
    int id;
    int v;
}s2[N];
int rear1,rear2;
bool cmp1(S1 a,S1 b){return a.v>b.v;}
bool cmp2(S2 a,S2 b){return a.v>b.v;}
int sum1[N],sum2[N];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int a,b;
        cin>>a>>b;
        if(a==1)
        {
            s1[++rear1].id=i;
            s1[rear1].v=b;
        }
        else
        {
            s2[++rear2].id=i;
            s2[rear2].v=b;
        }
    }
    sort(s1+1,s1+rear1+1,cmp1);
    sort(s2+1,s2+rear2+1,cmp2);
    for(int i=1;i<=rear1;i++)
        sum1[i]=(sum1[i-1]+s1[i].v);
    for(int i=1;i<=rear2;i++)
        sum2[i]=(sum2[i-1]+s2[i].v);
 
    int ans=0,cnt1=0,cnt2=0;
    for(int i=0;i<=rear1;i++)
    {
        if(i<=m)
        {
            int tans=0;
            tans+=sum1[i];
            if((m-i)/2>0)      //总体积-体积为1的总体积就是剩下的体积,出个2就是选的体积为2的个数
            {
                tans=tans+sum2[min((m-i)/2,rear2)];
            }
            if(tans>ans)
            {
                ans=tans;
                cnt1=i;
                cnt2=min((m-i)/2,rear2);
            }
        }
    }
    cout<<ans<<endl;
    for(int i=1;i<=cnt1;i++)
        cout<<s1[i].id<<" ";
    for(int i=1;i<=cnt2;i++)
        cout<<s2[i].id<<" ";
    cout<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/spzeno/p/11296826.html