zoukankan      html  css  js  c++  java
  • 贪心——poj 3171 Cleaning Shifts

    区间覆盖最小代价

    由于N<=10000

    排序后想到N*N的遍历

    不断更新add[i](表示到i最小代价)里的值,使之最小

    View Code
    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    using namespace std;

    const int maxint=999999999;
    struct data
    {
    int ll,rr,c;
    }s[10009];

    int add[10009];

    int cmp(data a,data b)
    {
    if(a.ll==b.ll)
    return a.rr<b.rr;
    else
    return a.ll<b.ll;
    }

    int main()
    {
    int n,begin,end;
    while(scanf("%d%d%d",&n,&begin,&end)!=EOF)
    {
    int i,j;
    for(i=1;i<=n;i++)
    {
    scanf("%d%d%d",&s[i].ll,&s[i].rr,&s[i].c);
    add[i]=maxint;
    s[i].rr++;

    }
    sort(&s[1],&s[n+1],cmp);

    if(s[1].ll>begin)
    {
    printf("-1\n");continue;
    }

    int mmax=s[1].rr;
    for(i=1;i<n;i++)
    {
    if(mmax>=s[i+1].ll)
    {
    mmax=max(mmax,s[i+1].rr);
    }
    else
    {
    break;
    }
    }
    if(mmax-1<end)
    {
    printf("-1\n");continue;
    }

    add[1]=s[1].c;
    for(i=1;i<=n;i++)
    {
    if(s[i].ll<=begin)
    add[i]=s[i].c;
    for(j=i+1;j<=n;j++)
    {
    if(s[i].ll==s[j].ll)continue;
    if(s[i].rr>=s[j].rr)continue;
    if(s[i].rr<s[j].ll)break;

    add[j]=min(add[j],add[i]+s[j].c);
    }
    }

    int mmin=maxint;
    for(i=1;i<=n;i++)
    {
    if(s[i].rr-1>=end)
    mmin=min(mmin,add[i]);
    }

    printf("%d\n",mmin);
    }
    }



  • 相关阅读:
    合并ts文件
    Typora
    Typora
    OCMock 3 参考
    git 修改上次提交信息 与 撤销此操作.
    git使用技巧
    python获取软件安装列表2222
    【Dojo 1.x】笔记6 配置对象dojoConfig的用处和真身所在
    【Dojo 1.x】笔记目录
    【Dojo 1.x】笔记5 使用本地引用
  • 原文地址:https://www.cnblogs.com/huhuuu/p/2342950.html
Copyright © 2011-2022 走看看