HDU 3440 House Man(编号排序+线性差分约束跑最短路)
House Man
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3605 Accepted Submission(s): 1517
The man can travel for at most a certain horizontal distance D in a single jump. To make this as much fun as possible, the crazy man want to maximize the distance between the positions of the shortest house and the tallest house.
The crazy super man have an ability—move houses. So he is going to move the houses subject to the following constraints:
1. All houses are to be moved along a one-dimensional path.
2. Houses must be moved at integer locations along the path, with no two houses at the same location.
3. Houses must be arranged so their moved ordering from left to right is the same as their ordering in the input. They must NOT be sorted by height, or reordered in any way. They must be kept in their stated order.
4. The super man can only jump so far, so every house must be moved close enough to the next taller house. Specifically, they must be no further than D apart on the ground (the difference in their heights doesn't matter).
Given N houses, in a specified order, each with a distinct integer height, help the super man figure out the maximum possible distance they can put between the shortest house and the tallest house, and be able to use the houses for training.
Each test case begins with a line containing two integers N (1 ≤ N ≤ 1000) and D (1 ≤ D ≤1000000). The next line contains N integer, giving the heights of the N houses, in the order that they should be moved. Within a test case, all heights will be unique.
4 4
20 30 10 40
5 6
20 34 54 10 15
4 2
10 20 16 13
Case 2: 3
Case 3: -1
n个房子,线性一维排列,房子有高度,房子不能在同一个位置,现在有一个超人,从最低的房子开始跳,
每次跳的房子的高度要求比上一个房子的高度高,每个房子都要跳,最后要停在最高的房子上
你可以随意改变任意房子之间的距离,但是不能改变房子的相对位置
每次超人最多跳D远,问你超人跳完之后
最低的房子和最高的房子之间的距离最大可以是多少?
每次要求跳的高度递增且要是最高的房子结束
说明跳的房子的顺序已经排列好了
给线性一维上的房子编个号,1到n
按照高度升序排序,得到的编号顺序就是跳的顺序
x[i]-x[j]表示房子i和j之间的距离,i>j
比如样例1
高度:20 30 10 40
编号:1 2 3 4
按照高度升序排序之后,跳的顺序为:3 1 2 4
对每次跳:
x[3]-x[1]<=d
x[2]-x[1]<=d
x[4]-x[2]<=d
注意每次都是编号大的房子位置减去编号小的房子位置,这样才能得到两者间的距离
则:x[i]-x[i-1]>=1,i属于2到n
变形一下:x[i-1]-x[i]<=-1
现在所有的约束关系是都是这个形式:x[i]-x[j]<=x
开始建图,j->i 权值为x
比如上面的样例:
1->3 权值4
11->2 权值4
2->4 权值4
2->1 权值-1
3->2 权值-1
题目要求是从最低的房子到最高的房子的最大距离
注意:是最高房子和最低房子中编号小的房子出发,做起点
最高房子和最低房子中编号大的房子结束,做终点
因为高的房子编号不一定大,低的房子编号不一定小
然后因为表达式是x[i]-x[j]<=x
所以是求最短路,不能使用dj,因为存在负权
推荐使用spfa
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<string.h>
#include<set>
#include<map>
#include<list>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long LL;
#define INF 9999999999
#define me(a,x) memset(a,x,sizeof(a))
int mon1[]= {,,,,,,,,,,,,};
int mon2[]= {,,,,,,,,,,,,};
int dir[][]= {{,},{,-},{,},{-,}}; int getval()
{
int ret();
char c;
while((c=getchar())==' '||c=='\n'||c=='\r');
ret=c-'';
while((c=getchar())!=' '&&c!='\n'&&c!='\r')
ret=ret*+c-'';
return ret;
}
void out(int a)
{
if(a>)
out(a/);
putchar(a%+'');
} #define max_v 1005
struct node
{
int v;
LL w;
node(int vv=,LL ww=):v(vv),w(ww) {}
};
struct node1
{
int id,v;
}p[max_v];
bool cmp(node1 a,node1 b)
{
return a.v<b.v;
}
LL dis[max_v];
int vis[max_v];
int cnt[max_v];
vector<node> G[max_v];
queue<int> q; void init()
{
for(int i=; i<max_v; i++)
{
G[i].clear();
dis[i]=INF;
vis[i]=;
cnt[i]=;
}
while(!q.empty())
q.pop();
} int spfa(int s,int n)
{
vis[s]=;
dis[s]=;
q.push(s);
cnt[s]++; while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=; for(int j=; j<G[u].size(); j++)
{
int v=G[u][j].v;
LL w=G[u][j].w; if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
if(vis[v]==)
{
q.push(v);
cnt[v]++;
vis[v]=; if(cnt[v]>n)
return ;
}
}
}
}
return ;
}
int f(int u,int v)
{
for(int j=; j<G[u].size(); j++)
{
if(G[u][j].v==v)
return ;
}
return ;
}
int main()
{
int t,ca=;
scanf("%d",&t);
while(t--)
{
int n,d;
scanf("%d %d",&n,&d);
for(int i=;i<=n;i++)
{
scanf("%d",&p[i].v);
p[i].id=i;
}
sort(p+,p++n,cmp);
init();
int x,y;
for(int i=;i<=n-;i++)
{
x=p[i].id;
y=p[i+].id;
int u=max(x,y);
int v=min(x,y);
if(f(v,u))
G[v].push_back(node(u,d));
}
for(int i=;i<=n;i++)
{
if(f(i,i-))
G[i].push_back(node(i-,-));
}
int s=min(p[n].id,p[].id);//!!!高的房子不一定编号大,低的房子不一定编号小,因为x[i]-x[j]<=x,要求i>j 请注意
int e=max(p[n].id,p[].id);
int flag=spfa(s,n);
printf("Case %d: ",ca++);
if(flag==)
{
printf("-1\n");
}else
{
printf("%lld\n",dis[e]);
}
}
return ;
} /*
题目意思:
n个房子,线性一维排列,房子有高度,房子不能在同一个位置,现在有一个超人,从最低的房子开始跳,
每次跳的房子的高度要求比上一个房子的高度高,每个房子都要跳,最后要停在最高的房子上
你可以随意改变任意房子之间的距离,但是不能改变房子的相对位置
每次超人最多跳D远,问你超人跳完之后
最低的房子和最高的房子之间的距离最大可以是多少? 分析:
每次要求跳的高度递增且要是最高的房子结束
说明跳的房子的顺序已经排列好了
给线性一维上的房子编个号,1到n
按照高度升序排序,得到的编号顺序就是跳的顺序 假设x[i]:表示房子i的位置
x[i]-x[j]表示房子i和j之间的距离,i>j
比如样例1
高度:20 30 10 40
编号:1 2 3 4
按照高度升序排序之后,跳的顺序为:3 1 2 4
对每次跳:
x[3]-x[1]<=d
x[2]-x[1]<=d
x[4]-x[2]<=d
注意每次都是编号大的房子位置减去编号小的房子位置,这样才能得到两者间的距离 隐藏关系:同一个位置不能有两个房子
则:x[i]-x[i-1]>=1,i属于2到n
变形一下:x[i-1]-x[i]<=-1
现在所有的约束关系是都是这个形式:x[i]-x[j]<=x
开始建图,j->i 权值为x
比如上面的样例:
1->3 权值4
11->2 权值4
2->4 权值4
2->1 权值-1
3->2 权值-1
题目要求是从最低的房子到最高的房子的最大距离
注意:是最高房子和最低房子中编号小的房子出发,做起点
最高房子和最低房子中编号大的房子结束,做终点
因为高的房子编号不一定大,低的房子编号不一定小
然后因为表达式是x[i]-x[j]<=x
所以是求最短路,不能使用dj,因为存在负权
推荐使用spfa */
HDU 3440 House Man(编号排序+线性差分约束跑最短路)的更多相关文章
- 【Nowcoder71E】组一组(差分约束,最短路)
[Nowcoder71E]组一组(差分约束,最短路) 题面 Nowcoder 题解 看到二进制显然就直接拆位,那么区间的按位或和按位与转成前缀和之后,可以写成两个前缀和的值的差的大小关系,那么直接差分 ...
- 【拓扑排序或差分约束】Guess UVALive - 4255
题目链接:https://cn.vjudge.net/contest/209473#problem/B 题目大意:对于n个数字,给出sum[j]-sum[i](sum表示前缀和)的符号(正负零),求一 ...
- POJ 3159 Candies(差分约束,最短路)
Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 20067 Accepted: 5293 Descrip ...
- HDU 3592 World Exhibition(线性差分约束,spfa跑最短路+判断负环)
World Exhibition Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 3666 THE MATRIX PROBLEM (差分约束,最短路)
题意: 给一个n*m矩阵,每个格子上有一个数字a[i][j],给定L和U,问:是否有这样两个序列{a1...an}和{b1...bn},满足 L<=a[i][j]*ai/bj<=U .若存 ...
- hdu 4598 Difference(奇圈判定+差分约束)
这是通化邀请赛的题,当时比赛的时候还完全没想法呢,看来这几个月的训练还是有效果的... 题意要求(1) |ai| < T for all i (2) (vi, vj) in E <=& ...
- poj 1364 King(线性差分约束+超级源点+spfa判负环)
King Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14791 Accepted: 5226 Description ...
- poj 3169 Layout(线性差分约束,spfa:跑最短路+判断负环)
Layout Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15349 Accepted: 7379 Descripti ...
- POJ 3169 Layout(差分约束 线性差分约束)
题意: 有N头牛, 有以下关系: (1)A牛与B牛相距不能大于k (2)A牛与B牛相距不能小于k (3)第i+1头牛必须在第i头牛前面 给出若干对关系(1),(2) 求出第N头牛与第一头牛的最长可能距 ...
随机推荐
- python内置函数每日一学 -- any()
any(iterable) 官方文档解释: Return True if any element of the iterable is true. If the iterable is empty, ...
- ajax jsonp的跨域请求
1.页面ajax的请求 $.ajax({ async: false, url: 'http://localhost:8080/downloadVideos',//跨域的dns/document!sea ...
- 从零开始学习html(十五)css样式设置小技巧——下
六.垂直居中-父元素高度确定的单行文本 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8&quo ...
- Oracle 12c SQL Developer连接报错(ORA-12505)
Oracle 12c SQL Developer连接报错(ORA-12505) 连接时报错码:Listener refused the connection with following error: ...
- VirtualBox安装Mac OS 10.11——虚拟机安装黑苹果
由于需要安装mac环境跑IOS应用,所以在虚拟机装个黑苹果. 一.下载虚拟机安装包,VirtualBox是官网下的最新版: 5.0.6 for Windows hosts x86/amd64 官网 ...
- cuda中当数组数大于线程数的处理方法
参考stackoverflow一篇帖子的处理方法:https://stackoverflow.com/questions/26913683/different-way-to-index-threads ...
- Prometheus Node_exporter 之 Memory Detail Meminfo /proc/meminfo
1. Memory Active / Inactive type: GraphUnit: bytesLabel: BytesInactive - 最近使用较少的内存, 优先被回收利用 /proc/me ...
- python设计模式之门面模式
一.结构型设计模式 门面模式与单例模式,工厂模式不同,它是一种结构型模式. 结构型模式描述如何将对象和类组合成更大的结构 结构型模式是一种能够简化设计工作的模式,它能找出更简单的方法来认识或表示实体之 ...
- [IDEA_1] IDEA 使用指南
1. IDEA 安装与配置 具体细节待补充... 2. 优化编程体验 2.1.1 新建类后自动添加自定义的注释 在主界面使用快捷键 Ctrl + Alt + S 进入 Settings 页面 依次打开 ...
- hyper-v NAT网络
宿主机:windows 2008 R2 企业版 hyper-V配置静态IP地址 https://jingyan.baidu.com/article/925f8cb8ae1ee2c0dde05632.h ...