cf3b(贪心)
题目链接:http://www.codeforces.com/problemset/problem/3/B
思路:不错的贪心题,我们可以先按体积升序排,体积相同的体积为1的升序排,体积为2的降序排,这样选择的时候就能最优。
View Code
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<string> 6 using namespace std; 7 #define MAXN 100000+10 8 struct Node{ 9 int w,v,index; 10 }node[MAXN]; 11 int n,m; 12 13 //排序的时候先按体积升序排,1类按v升序排,2类按v降序排,这样可以保证是最优的。 14 int cmp(const Node &p,const Node &q){ 15 if(p.w!=q.w){ 16 return p.w<q.w; 17 }else if(p.w==1){ 18 return p.v<q.v; 19 }else 20 return p.v>q.v; 21 } 22 23 int main(){ 24 while(~scanf("%d%d",&n,&m)){ 25 for(int i=1;i<=n;i++){ 26 int x,y; 27 scanf("%d%d",&x,&y); 28 node[i].index=i; 29 node[i].v=y; 30 x==1?node[i].w=1:node[i].w=2; 31 } 32 sort(node+1,node+n+1,cmp); 33 int MAX=0,w1=0,v1=0,MAXi=1; 34 for(int i=1,j=1;i<=n;i++){ 35 w1+=node[i].w; 36 v1+=node[i].v; 37 while(w1>m){ 38 w1-=node[j].w; 39 v1-=node[j].v; 40 j++; 41 } 42 if(v1>MAX){MAX=v1;MAXi=j;}//j记录最大值的起始位置 43 } 44 printf("%d\n",MAX); 45 w1=v1=0; 46 for(int j=MAXi;j<=n;j++){ 47 w1+=node[j].w; 48 v1+=node[j].v; 49 if(w1>m)break; 50 j==MAXi?printf("%d",node[j].index):printf(" %d",node[j].index); 51 } 52 puts(""); 53 } 54 return 0; 55 }