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 650A Watchmen