zoukankan      html  css  js  c++  java
  • POJ 3038 贪心(multiset)

    题意:
    这里写图片描述
    这里写图片描述
    思路:
    1. 贪心 我们考虑肯定是走最近的最合适

    想象自己是一个黑一日游的司机:
    1.如果有乘客要上车,那么就让他上,收钱!
    2.如果超载了,把距目的地最远的几个乘客踢下去,退钱。
    3.行驶到下一站
    (摘自http://blog.sina.com.cn/s/blog_9d987af5010158ih.html
    多么生动形象….

    用multiset乱搞就可以了(我代码写得很丑 慎看)

    2 乱想的.. 我觉得可以用最大费用流+消圈来搞 (然而并不会 (也不能证明正确性) 也很可能会T )

    //By SiriusRen
    #include <set>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    struct Node{int from,to,num;}node[50005];
    int k,n,c,size,ans,tot=1;
    struct cmp2{
        bool operator ()(Node a,Node b){
            return a.to<b.to;
        }
    };
    multiset<Node,cmp2>s;
    multiset<Node,cmp2>::iterator it;
    bool cmp(Node a,Node b){return a.from<b.from;}
    int main(){
        scanf("%d%d%d",&k,&n,&c);
        for(int i=1;i<=k;i++){
            scanf("%d%d%d",&node[i].from,&node[i].to,&node[i].num);
        }
        sort(node+1,node+1+k,cmp);
        for(int i=1;i<=n;i++){
            while(node[tot].from==i){
                if(tot>k)break;
                if(node[tot].to<node[tot].from){tot++;continue;}
                s.insert(node[tot]);
                size+=node[tot].num;
                tot++;
            }
            it=s.begin();
            while((*it).to==i&&!s.empty()){
                ans+=(*it).num;
                size-=(*it).num;
                s.erase(it);
                it=s.begin();
            }
            while(size>c){
                it=s.end();it--;Node jy=*it;
                int temp=(*it).num;s.erase(it);
                if(size-temp>c)size-=temp;
                else{
                    jy.num=temp-(size-c);
                    s.insert(jy);
                    size=c;
                }
            }
        }
        size=0,tot=k;s.clear();
        for(int i=n;i;i--){
            while(node[tot].from==i){
                if(tot<1)break;
                if(node[tot].to>node[tot].from){tot--;continue;}
                s.insert(node[tot]);
                size+=node[tot].num;
                tot--;
            }
            it=s.end();
            if(!s.empty())it--;
            else goto ed;
            while((*it).to==i){
                ans+=(*it).num;
                size-=(*it).num;
                s.erase(it);
                it=s.end();
                if(!s.empty())it--;
                else break;
            }
            ed:while(size>c){
                it=s.begin();Node jy=*it;
                int temp=(*it).num;s.erase(it);
                if(size-temp>c){
                    size-=temp;
                }
                else{
                    jy.num=temp-(size-c);
                    s.insert(jy);
                    size=c;
                }
            }
        }
        printf("%d
    ",ans);
    }

    这里写图片描述

  • 相关阅读:
    Linux 安装多版本Python
    ElasticSearch 镜像 & 安装 & 简易集群
    SpringBoot-异步调用@Async
    SprinigBoot整合Kafka
    Kafka快速安装部署
    Linux-JDK安装
    npm / yarn 配置镜像、使用方法
    React搭建项目(全家桶)
    原生JS 将canvas生成图片
    原生 JS 的 Base64 转码
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532219.html
Copyright © 2011-2022 走看看