POJ 1201

给你N个闭区间。每个区间分别为[ai,bi],你必须在这个区间上至少取ci个不同的整数。

现要求所有区间满足各自的条件。

问最少需要选多少个点。

例如[3,7](3)  [8,10](3)  [6,8](1)  [1,3](1)  [10,11](1)

我们最少需要选6个点:

3 4 6 8 9 10

在这里我们可以看成是dp[7]-dp[2]>=3 dp[10]-dp[8]>=3 ....

这就可以理解为2->7的距离可以定为3,8->10的距离也定为3

我们再看看Si的定义,也不难写出0<=Si - Si-1<=1的限制条件,虽然看上去是没有什么意义的条件,但是如果你也把它构造出一系列的边的话,这样从起点到终点的最短路也就顺理成章的出现了。

我们将上面的限制条件写为同意的形式:

Sbi - Sai >= ci

Si - Si-1 >= 0

Si-1 - Si >= -1

这样子我们相当于在一个构建好的有向图中找一个最长路径,这跟之前的最短路径正好相反,所以需要引起注意

那么dp在初始化时需尽可能小,才能不断更新出最大值

  memset(dp,-,sizeof(dp)); 
for(int i=first[u];i!=-;i=area[i].next){
if(dp[area[i].y]<dp[u]+area[i].d){
dp[area[i].y]=dp[u]+area[i].d;
if(!visit[area[i].y])
visit[area[i].y]=,q.push(area[i].y);
}

所以这里要引起注意,要在小于的情况下继续执行程序,不断更新出最大值。

对于一个差分问题来说是可能存在无解的情况的,那说明形成的是负圈,但这道题目明显表示有解,所以无需进行负圈的判断。

总代码如下:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std;
#define N 50005
#define M 200000 int visit[N],dp[N],first[N],k,n,m,maxn,minn; struct Area{
int y,next,d;
}area[M]; void init()
{
k=,maxn=,minn=N;
memset(first,-,sizeof(first));
} void add(int a,int b,int c){
area[k].y=b,area[k].d=c,area[k].next=first[a];
first[a]=k;
k++;
} void spfa()
{
memset(visit,,sizeof(visit));
queue<int> q;
memset(dp,-,sizeof(dp));
dp[minn]=,visit[minn]=,q.push(minn);
while(!q.empty()){
int u=q.front();
q.pop();
visit[u]=;
for(int i=first[u];i!=-;i=area[i].next){
if(dp[area[i].y]<dp[u]+area[i].d){
dp[area[i].y]=dp[u]+area[i].d;
if(!visit[area[i].y])
visit[area[i].y]=,q.push(area[i].y);
}
}
}
} int main()
{
int a,b,c;
while(scanf("%d",&n)!=EOF){
init();
for(int i=;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
//add(b,a-1,-c);
add(a,b+,c);
maxn=max(maxn,b+);
minn=min(minn,a);
}
for(int i=minn;i<maxn;i++){
add(i,i+,);
add(i+,i,-);
}
spfa(); printf("%d\n",dp[maxn]);
}
return ;
}

POJ 1201 差分方程分析的更多相关文章

  1. POJ 1201 &amp;&amp; HDU 1384 Intervals(差动制动系统)

    职务地址:POJ 1201   HDU 1384 依据题目意思.能够列出不等式例如以下: Sj-Si>=c; Si-S(i-1)>=0; S(i-1)-Si>=-1; 然后用最短路s ...

  2. poj 1201 Intervals 解题报告

    Intervals Time Limit: 2000MS   Memory Limit: 65536KB   64bit IO Format: %lld & %llu Submit Statu ...

  3. 【POJ 1201】 Intervals(差分约束系统)

    [POJ 1201] Intervals(差分约束系统) 11 1716的升级版 把原本固定的边权改为不固定. Intervals Time Limit: 2000MS   Memory Limit: ...

  4. POJ 1201 Intervals || POJ 1716 Integer Intervals 差分约束

    POJ 1201 http://poj.org/problem?id=1201 题目大意: 有一个序列,题目用n个整数组合 [ai,bi,ci]来描述它,[ai,bi,ci]表示在该序列中处于[ai, ...

  5. poj 1201 Intervals(差分约束)

    题目:http://poj.org/problem?id=1201 题意:给定n组数据,每组有ai,bi,ci,要求在区间[ai,bi]内至少找ci个数, 并使得找的数字组成的数组Z的长度最小. #i ...

  6. poj 1201 Intervals——差分约束裸题

    题目:http://poj.org/problem?id=1201 差分约束裸套路:前缀和 本题可以不把源点向每个点连一条0的边,可以直接把0点作为源点.这样会快许多! 可能是因为 i-1 向 i 都 ...

  7. POJ 1201 &amp; HDU1384 &amp; ZOJ 1508 Intervals(差分约束+spfa 求最长路径)

    题目链接: POJ:http://poj.org/problem?id=1201 HDU:http://acm.hdu.edu.cn/showproblem.php? pid=1384 ZOJ:htt ...

  8. 【38.24%】【POJ 1201】Intervals

    Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25902 Accepted: 9905 Description You are ...

  9. POJ 1201 Intervals【差分约束】

    传送门:http://poj.org/problem?id=1201 题意: 有n个如下形式的条件:,表示在区间[, ]内至少要选择个整数点.问你满足以上所有条件,最少需要选多少个点? 思路:第一道差 ...

随机推荐

  1. 你不知道的border-radius

    对于border-radius这个属性,我们知道它可以用来设置边框圆角,利用它我们可以画出很多形状 这就需要了解到border-radius的各式写法: border-radius的写法: 1.只设置 ...

  2. Smart 组件 vs Dumb 组件

    大家已经知道,只会接受 props 并且渲染确定结果的组件我们把它叫做 Dumb 组件,这种组件只关心一件事情 —— 根据 props 进行渲染. Dumb 组件最好不要依赖除了 React.js 和 ...

  3. AJPFX对选择和冒泡两种排序的理解

    冒泡排序和直接选择排序都是排序中比较简单和容易实现的算法,先简单说说两者的区别:先以按照元素从小到大为:冒泡排序:将相邻元素两两比较,如果有比较大的,就把比较大的放在右边,这样的结果就是一轮排序完毕后 ...

  4. RPC之远程过程调用

    一. 简介 将一个函数运行在远程计算机上并且等待获取那里的结果,这个称作远程过程调用(Remote Procedure Call)或者 RPC. RPC是一个计算机通信协议. 1. 类比: 将计算机服 ...

  5. C# string日期格式

    百分数格式应该用“p”这个参数. 格式 原始 数据 结 果 "{0:P}" 0.40 40% 数字 {0:N2} 12.36  数字 {0:N0} 13  货币 {0:c2} $1 ...

  6. element ui select组件和table做分页完整功能和二级联动效果

    <template> <div class="index_box"> <div class="search_box"> &l ...

  7. 算法之A星算法(寻路)

    1.启发式搜索:启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标.这样可以省略大量无谓的搜索路径,提高了效率.在启发式搜索中,对位置的估价是十分 ...

  8. 15分钟学会使用Git

    http://blog.csdn.net/u013510614/article/details/50588446 主体思想 Git作为一个复杂的版本控制系统,命令之多,相信很多小白已经望而却步,有的尝 ...

  9. liunx防火墙的基本操作

    centos7中的使用 CentOS 7.0默认使用的是firewall作为防火墙 查看防火墙状态------->firewall-cmd --state 停止firewall-------&g ...

  10. dmesg -检测和控制内核环缓冲

    NAME dmesg - print or control the kernel ring buffer 总览 dmesg [ -c ] [ -n 级别 ] [ -s 缓冲区大小 ] 描述 dmesg ...