2010多校第一题 hdu3440House Man 差分约束系统
给我们n座房子,房子的高度各不相同, 从最低的房子开始, 每次跳到更高的房子, 跳n-1次最能跳到最高的房子了,但是每次跳跃的距离不能超过d
将这些房子在一维的方向上重新摆放(但是保持输入时的相对位置不变) , 使得最矮的房子和最高的房子水平距离最大
将房子的坐标设为xi, n个变量, 和2(n-1)个约束关系, 典型的差分约束系统
高度相近的两个坐标(设为xi,xj)相减 abs(xi-xj) <= d, 要想办法去掉绝对值, 那么规定一律id大的减去id小的,那么结果就是正的
又需要保持输入的相对位置不变, 那么 x(i+1) - x(i) >=1, 因为要化为最短路 所以是 x(i) - x(i+1) <= -1
所以按照上面的分析构造图,然后跑一边最短路即可。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <math.h>
using namespace std;
#pragma warning(disable:4996)
#pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
const int INF = << ;
/* */
const int N = + ;
struct Node
{
int id, height;
bool operator <(const Node &rhs)
{
return height < rhs.height;
}
}a[N];
struct Edge
{
int v, dist;
Edge(){}
Edge(int _v, int _dist) :v(_v), dist(_dist){}
bool operator<(const Edge&rhs)const
{
return dist > rhs.dist;
}
};
vector<Edge> g[N];
int dist[N];
bool vis[N];
int dij(int x, int y, int n)
{
for (int i = ; i <= n; ++i)
dist[i] = INF;
priority_queue<Edge> q;
Edge cur, tmp;
cur.dist = dist[x] = ;
cur.v = x;
q.push(cur);
while (!q.empty())
{
cur = q.top(); q.pop();
int u = cur.v;
if (dist[u] < cur.dist)//如果cur.dist < dist[u], 那么可以继续更新其他顶点, 代替了条件vis[u]
continue;
for (int i = ; i < g[u].size(); ++i)
{
int v = g[u][i].v;
if (dist[v] > dist[u] + g[u][i].dist)
{
tmp.dist = dist[v] = dist[u]+ g[u][i].dist;
tmp.v = v;
q.push(tmp);
}
}
}
return dist[y];
} int spfa(int x, int y, int n)
{
for (int i = ; i <= n; ++i)
dist[i] = INF;
queue<int> q;
q.push(x);
dist[x] = ;
while (!q.empty())
{
int u = q.front(); q.pop();
vis[u] = false;
for (int i = ; i < g[u].size(); ++i)
{
int v = g[u][i].v;
if (dist[v] > dist[u] + g[u][i].dist)
{
dist[v] = dist[u] + g[u][i].dist;//能更新就更新
if (!vis[v])//如果结点在队里里面,就不用重复入队了
{
q.push(v);
vis[v] = true;
}
}
}
}
return dist[y];
}
int main()
{ int n, d, t;
scanf("%d", &t);
for (int k = ; k <= t; ++k)
{
scanf("%d%d", &n, &d);
for (int i = ; i <= n; ++i)
g[i].clear();
for (int i = ; i <= n; ++i)
{
scanf("%d", &a[i].height);
a[i].id = i;
if (i != )
g[i].push_back(Edge(i-, -));
}
sort(a + , a + n + );
bool flag = true;
for (int i = ; i <= n; ++i)
{
if (abs(a[i].id - a[i - ].id) > d)
{
flag = false;
break;
}
g[min(a[i].id, a[i - ].id)].push_back(Edge(max(a[i].id, a[i - ].id), d));
}
printf("Case %d: ", k);
if (!flag)
puts("-1");
else
{
if (a[].id > a[n].id)
swap(a[].id, a[n].id);
printf("%d\n", spfa(a[].id, a[n].id,n));
} }
return ;
}
用最短路求出解后, 其它点与源点的差值最大。
用最长路求出解后,其它点与源点的差值最小。
2010多校第一题 hdu3440House Man 差分约束系统的更多相关文章
- 【BZOJ2330】糖果(差分约束系统,强连通分量,拓扑排序)
		
题意: 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖 ...
 - P1993 小K的农场 差分约束系统
		
这个题是一道差分约束系统的裸题,什么是差分约束系统呢?就是给了一些大小条件,然后让你找一个满足的图.这时就要用差分约束了. 怎么做呢?其实很简单,就是直接建图就好,但是要把所有条件变为小于等于号,假如 ...
 - 【POJ 1716】Integer Intervals(差分约束系统)
		
id=1716">[POJ 1716]Integer Intervals(差分约束系统) Integer Intervals Time Limit: 1000MS Memory L ...
 - 2019年牛客多校第一场B题Integration  数学
		
2019年牛客多校第一场B题 Integration 题意 给出一个公式,求值 思路 明显的化简公式题,公式是分母连乘形式,这个时候要想到拆分,那如何拆分母呢,自然是裂项,此时有很多项裂项,我们不妨从 ...
 - POJ 1364 King --差分约束第一题
		
题意:求给定的一组不等式是否有解,不等式要么是:SUM(Xi) (a<=i<=b) > k (1) 要么是 SUM(Xi) (a<=i<=b) < k (2) 分析 ...
 - 2018年多校第三场第一题 A. Ascending Rating hdu6319
		
比赛地址:http://acm.hdu.edu.cn/contests/contest_show.php?cid=804 题目编号:第一题 A. Ascending Rating hdu6319 题 ...
 - Google Code Jam 第一题
		
通过的第一题,留做纪念,呵呵,非常简单,Africa 2010, Qualification Round: Store Credit. #include <stdio.h> #includ ...
 - 2017Summmer_上海金马五校 F题,G题,I题,K题,J题
		
以下题目均自己搜 F题 A序列 一开始真的没懂题目什么意思,还以为是要连续的子串,结果发现时序列,简直智障,知道题意之后,好久没搞LIS,有点忘了,复习一波以后,直接双向LIS,处理处两个数组L和R ...
 - BestCoder Round #1 第一题 逃生
		
// 等了好久,BESTCODER 终于出来了..像咋这样的毕业的人..就是去凑凑热闹// 弱校搞acm真是难,不过还是怪自己不够努力// 第一题是明显的拓扑排序,加了了个字典序限制而已// 用优先队 ...
 
随机推荐
- 斐讯K2 V22.X.X.X 新版固件 刷机教程 (开telnet,安装SSH,adbyby,刷breed,华硕Padavan)
			
源:http://www.right.com.cn/forum/thread-191833-1-1.html 属于我的上一个帖子的升级版,基本属于无脑操作,点击恢复就可以自动刷好breed,浏览上传新 ...
 - 【设计模式】Singleton模式C++实现
			
Singleton是设计模式中比较简单的一个.园中的朋友们应该都很熟悉了.前段时间参加xxx外企的面试,和面试官讨论C++的时候正好写了一个.当时由于在有些地方考虑不太周全,代码出现了一些疏漏.不过最 ...
 - FOJ 2170 花生的序列 dp
			
题目链接:http://acm.fzu.edu.cn/problem.php? pid=2170 贴个baka爷的代码留念.. 数据出的有问题.输入的字符串长度不超过1000 #include< ...
 - mybatis 的简单使用
			
须要用到的包:(这里仅仅是当中一个版本号.其它的百度) mysql-connector-java-5.1.6-bin mybatis-3.2.2 先看项目文件夹: 配置文件mybatisconfig. ...
 - Mac OS升级到Yosemite后一些问题
			
苹果"优山美地"採用移动设备平面风格,看起来还是相当清爽. 只是升级完还是有一些程序兼容性问题的. 1. 开发Android的程序猿们,Java se 6 须要升级到2014_00 ...
 - TCP、UDP数据包大小的限制(UDP数据包一次发送多大为好)——数据帧的物理特性决定的,每层都有一个自己的数据头,层层递减
			
1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Da ...
 - RF+Selenium2Library+Sikuli集成环境搭建
			
Sikuli是通过截图来编写代码的脚本语言,他是对于Selenium不好处理的一些模态窗口.flash等的利器.废话少说,直接开始安装吧.安装RF+Selenium2Library的环境这里就不说了, ...
 - iPhone开发【一】从HelloWorld開始
			
转载请注明出处,原文网址:http://blog.csdn.net/m_changgong/article/details/8013553 作者:张燕广 从经典的HelloWorld開始踏入iPhon ...
 - [Android学习笔记]Canvas的使用
			
Canvas文档 http://developer.android.com/training/index.html 在绘制view时候,重写onDraw(canvas)方法,可能需要在canvas上绘 ...
 - 理解 Python 中的线程
			
原地址:http://blog.jobbole.com/52060/ 本文由 伯乐在线 - acmerfight 翻译自 Akshar Raaj.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. 我 ...