• 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 }
  • 相关阅读:
    FileZilla 双向传输
    移动端弱网测试工具
    来源IP安全分析,对IP溯源
    推荐几款移动端抓包小工具
    一键清除Chrome
    resit阶段二
    redist集群
    redits04 快照配置
    ridts08管理工具
    redits07配置文件
  • 原文地址:https://www.cnblogs.com/wally/p/3052785.html
Copyright © 2020-2023  润新知