• POJ 1201 Intervals


    Description

    You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn.
    Write a program that:
    reads the number of intervals, their end points and integers c1, ..., cn from the standard input,
    computes the minimal size of a set Z of integers which has at least ci common elements with interval [ai, bi], for each i=1,2,...,n,
    writes the answer to the standard output.

    Input

    The first line of the input contains an integer n (1 <= n <= 50000) -- the number of intervals. The following n lines describe the intervals. The (i+1)-th line of the input contains three integers ai, bi and ci separated by single spaces and such that 0 <= ai <= bi <= 50000 and 1 <= ci <= bi - ai+1.

    Output

    The output contains exactly one integer equal to the minimal size of set Z sharing at least ci elements with interval [ai, bi], for each i=1,2,...,n.

    Sample Input

    5
    3 7 3
    8 10 3
    6 8 1
    1 3 1
    10 11 1

    Sample Output

    6
    给定n个闭区间[ai,bi](1≤i≤n,0≤ai≤bi≤50000) 和n个整数ci(1≤i≤n)
    你需要在数轴上选出尽可能少的点,满足每个区间[ai,bi]中,至少有ci个数被选中了。
    //差分约束系统
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    using namespace std;
    #define INF 1044266558
    struct edge{
        int v,w,next;
    }e[150006];
    int dis[50006],head[50006],in[50006],ans=0;
    int l=INF,r=0,n;
    void add_edge(int u,int v,int w){
        e[ans].v=v;
        e[ans].w=w;
        e[ans].next=head[u];
        head[u]=ans++;
    }
    void bfs(){
        queue<int>q;
        q.push(l);
        memset(dis,-1,sizeof(dis));
        dis[l]=0;
        while(!q.empty()){
            int u=q.front();
            q.pop();
            in[u]=0;
            for(int i=head[u];i!=-1;i=e[i].next){
                int v=e[i].v;
                if(dis[v]<dis[u]+e[i].w){
                    dis[v]=dis[u]+e[i].w;
                    if(!in[v]){
                        in[v]=1;
                        q.push(v);
                    }
                }
            }
        }
    }
    int main(){
        scanf("%d",&n);
        memset(head,-1,sizeof(head));
        for(int i=0;i<n;i++){
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            add_edge(u,v+1,w);
            l=min(l,u);
            r=max(r,v+1);
        }
        for(int i=l;i<r;i++){
            add_edge(i,i+1,0);
            add_edge(i+1,i,-1);
        }
        bfs();
        printf("%d
    ",dis[r]);
        return 0;
    }
  • 相关阅读:
    运维面试题之系统运维
    运维面试题之linux编程
    运维面试题之linux基础
    运维面试题之网络
    python 查找日志关键字
    python 数组中数字求和是否为零
    python 时间戳和时间格式互相转换
    Appium环境搭建说明(包括报错处理)
    python操作上级子文件
    去除ufeff的解决方法,python语言
  • 原文地址:https://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/9897862.html
Copyright © 2020-2023  润新知