• 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);
    }

    这里写图片描述

  • 相关阅读:
    libxml2 使用教程【转】
    c++实现Xml和json互转【转】
    C++中JSON的使用详解【转】
    Libxml2函数及使用方法概述【转】
    首个threejs项目-前端填坑指南【转】
    如何使用chrome自带的Javascript调试工具 【转】
    require.js 最佳实践【转】
    Cesium中导入三维模型方法(dae到glft/bgltf) 【转】
    华为ap3010DN-V2刷出胖AP并配置接入POE交换机实现上网
    k8s cronjob设置作业失败后退出不重复执行
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532219.html
Copyright © 2020-2023  润新知