• POJ 1716 区间最小点个数


    题意:
         给你n个区间,每个区间最少取两个元素,问你所有区间最少取几个元素(可以满足
    每个区间最少两个元素)。

     

    思路:
         这个题目感觉挺巧妙的,之前在杭电上做过这个题目,这个题目可以用查分约束来做
    ,对于每一个区间a,b我们可以这样 b - a >= 2 那么建图a->b 长度是2,全建完之后不要忘记题目的隐含条件,查分约束中隐含条件很重要,这个题目的隐含条件就是相邻的两个点之间的个数大于等于0,小于等于1,也就是  0 =< i - (i - 1) <= 1,然后拆成两部分,对于i - (i - 1) >= 0  建立 (i - 1)-> i 长度0,对于i - (i - 1) <= 1先转换成 (i - 1) - i >= -1 建立 i -> (i - 1) 长度是-1,然后以最小点为起点一边最长路,在查分约束中要记住,求最小就跑最长路,求最大就跑最短路,其他的没啥。

     

    #include<stdio.h>
    #include<string.h>
    #include<queue>

    #define N_node 11000
    #define N_edge 33000
    #define INF 1000000000

    using namespace std;

    typedef struct
    {
       int to ,next ,cost;
    }STAR;


    STAR E[N_edge];
    int list[N_node] ,tot;
    int mark[N_node] ,mki[N_node] ,s_x[N_node];

    void add(int a ,int b ,int c)
    {
         E[++tot].to = b;
         E[tot].cost = c;
         E[tot].next = list[a];
         list[a] = tot;
    }

    bool spfa(int s ,int n)
    {
       for(int i = 0 ;i <= n ;i ++)
       s_x[i] = -INF ,mark[i] = mki[i] = 0;
       queue<int>q;
       q.push(s);
       s_x[s] = 0 ,mark[s] = mki[s] = 1;
       while(!q.empty())
       {
          int xin ,tou;
          tou = q.front();
          q.pop();
          mark[tou] = 0;
          for(int k = list[tou] ;k ;k = E[k].next)
          {
              xin = E[k].to;
              if(s_x[xin] < s_x[tou] + E[k].cost)
              {
                 s_x[xin] = s_x[tou] + E[k].cost;
                 if(!mark[xin])
                 {
                    mark[xin] = 1;
                    if(++mki[xin] > n) return 0;
                    q.push(xin);
                 }
               }
           }
       }
       return 1;
    }

    int main ()
    {
        int i ,a ,b ,n ,Min ,Max;
        while(~scanf("%d" ,&n))
        {
           Min = INF ,Max = -INF;
           memset(list ,0 ,sizeof(list)) ,tot = 1;
           for(i = 1 ;i <= n ;i ++)
           {
              scanf("%d %d" ,&a ,&b);
              b++;
              if(Min > a) Min = a;
              if(Max < b) Max = b;
              add(a ,b ,2);
           }
           for(i = Min ;i <= Max ;i ++)
           add(i - 1 ,i ,0) ,add(i ,i - 1 ,-1);
           spfa(Min ,Max);
           printf("%d " ,s_x[Max]);
        }
        return 0;
    }
          
          
      

  • 相关阅读:
    python基础学习1-网络爬虫程序中的代理IP设置
    python基础学习1-翻译程序(连接到有道翻译网)
    python基础学习1-第一个网络爬虫程序
    python基础学习1-迭代器
    python基础学习1-列表推导式和字典推导式
    python基础学习1-类属性访问
    python基础学习1-描述符
    python基础学习2-easygui框架编程
    python基础学习1-计数器实例
    HDU2896 病毒侵袭
  • 原文地址:https://www.cnblogs.com/csnd/p/12062753.html
Copyright © 2020-2023  润新知