CF3B Lorry
Posted qyj060604
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF3B Lorry相关的知识,希望对你有一定的参考价值。
CF3B Lorry
Greedy
将两种体积的物体分类
组内按价值从大往小排序
枚举A物品选几个,算出B最多能选几个
这样既可
代码:
#include<bits/stdc++.h> using namespace std; struct node int rank; int value; ; const int N=100005; int n,m; node a[N],b[N]; int s[N]; int cnta=0,cntb=0; int ans1=-1,ans21=-1,ans22=-1,sum=0,opt=0; bool cmp(node x,node y) return x.value>y.value?1:0; int main() scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) int x,y; scanf("%d%d",&x,&y); if(x==1) a[++cnta].value=y,a[cnta].rank=i; else b[++cntb].value=y,b[cntb].rank=i; sort(a+1,a+cnta+1,cmp); sort(b+1,b+cntb+1,cmp); s[0]=0; for(int i=1;i<=cntb;i++) s[i]=s[i-1]+b[i].value; a[0].value=0; for(int i=0;i<=min(cnta,m);i++) opt+=a[i].value; sum=opt; int u=(m-i)/2; sum+=s[min(u,cntb)]; if(ans1==-1) ans1=sum; ans21=i; ans22=min(cntb,u); else if(sum>ans1) ans1=sum; ans21=i; ans22=min(cntb,u); printf("%d\n",ans1); for(int i=1;i<=ans21;i++) printf("%d ",a[i].rank); for(int i=1;i<=ans22;i++) printf("%d ",b[i].rank); printf("\n"); return 0;
以上是关于CF3B Lorry的主要内容,如果未能解决你的问题,请参考以下文章