博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1201-Intervals(差分约束系统)
阅读量:6258 次
发布时间:2019-06-22

本文共 1128 字,大约阅读时间需要 3 分钟。

题目地址:

题意:构造一个集合,这个集合内的数字满足所给的n个条件。每一个条件都是指在[a,b]内至少有c个数在集合内。问集合最少包括多少个点。即求至少有多少个元素在区间[a,b]内。

思路:

对于题目中所说的每一个条件[a,b]内至少有c个数在集合能够表示为dis(b+1)-dis(a)>=c,能够看出是求最长路

然后题目中存在着隐藏条件。

dis表示的是在[0,i-1]的范围内,要选多少个数。数列dis是递增的,可是增量最大是1。也就是说0<=dis(i)-dis(i-1)<=1,这个式子等价于dis(i)-dis(i-1)<=1和dis(i-1)-dis(i)<=0

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const double pi= acos(-1.0);const double esp=1e-6;const int MAXN=50010;int head[MAXN],vis[MAXN],dis[MAXN];int cnt;struct node{ int v,w; int next;}edge[1000010];void add(int u,int v,int w){ edge[cnt].v=v; edge[cnt].w=w; edge[cnt].next=head[u]; head[u]=cnt++;}void SPFA(int s){ int i; memset(dis,-inf,sizeof(dis)); memset(vis,0,sizeof(vis)); queue
q; dis[s]=0; vis[s]=1; q.push(s); while(!q.empty()){ int u=q.front(); q.pop(); vis[u]=0; for(i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if(dis[v]

转载于:https://www.cnblogs.com/yutingliuyl/p/7047434.html

你可能感兴趣的文章
vbs获取当前主机IP
查看>>
IIS7中的站点、应用程序和虚拟目录详细介绍
查看>>
为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
查看>>
对Map按key和value分别排序
查看>>
知名第三方编译版tete009 Firefox 24.0
查看>>
java反射生成ORM
查看>>
堆和栈的区别
查看>>
生成CSV文件后再将CSV文件导入到mysql
查看>>
Html.DropDownListFor练习(2)
查看>>
Eclipse+Maven创建webapp项目<一>
查看>>
筑巢引凤
查看>>
C# console application executing macro function
查看>>
dll的概念 dll导出变量 函数 类
查看>>
HDUOJ------------1051Wooden Sticks
查看>>
Winform开发框架之权限管理系统改进的经验总结(4)--用户分级管理
查看>>
SQLSERVER PRINT语句的换行
查看>>
Web Service 的工作原理
查看>>
tesseract ocr文字识别Android实例程序和训练工具全部源代码
查看>>
嵌入式操作系统的调试
查看>>
DroidPHP-A PHP Webserver for android
查看>>