CodeForces 3B-Lorry

Posted spzeno

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

 

以上是关于CodeForces 3B-Lorry的主要内容,如果未能解决你的问题,请参考以下文章

codeforces上怎么看测试数据

codeforces比赛后怎么看题解和答案

codeforces是啥?

codeforces Codeforces 650A Watchmen

CodeForces - 504A && CodeForces - 624C && CodeForces - 2B

codeforces怎麼看别人的代码