【題目描述】
最近有一款很火的遊戲,叫做八分音符醬,它和馬里奧很相似,不過它的跳躍距離是由你的聲音大小來控制
的。不過我們現在對玩法就行一些修改:
現有一共有n 個柱子,兩個相鄰的柱子之間的初始水平距離為1,蠢蠢的jyb 現在在最矮的柱子上,他每次
只能向恰好比這個柱子高的另乙個柱子跳躍,最後要跳到最高的柱子上。
jyb 需要從第二個柱子跳到第乙個柱子,再跳到第三個柱子。
jyb 的最大聲音為d,代表他能在滿足 |posi-posj| + |heighti-heightj | ≤d 的兩個柱子之間跳躍。
假設我們可以在不改變它們位置的相對順序的前提下水平移動柱子,調整他們的水平位置(但相鄰間隔至少為1,且為整數)。
jyb 想問你:在能從最矮柱子跳到最高柱子的前提下,它們(最矮柱子跳到最高柱子) 的最大水平距離是多少。
【輸入描述】
第1 行,1 個整數t, 表示資料組數,對於每組資料:
第1 行,1 個整數n;m,表示一共有多少個柱子。
接下來1 行,有n 個數,hi 表示柱子的高度。保證柱子高度互不相同
【輸出描述】
對於每組資料,輸出在能從最矮柱子跳到最高柱子的前提下,它們的最大水平距離是多少。如果不能,輸出-1
【輸入樣例1】
23 4
3 2 4
3 43 2 6
【輸出樣例1】
-1【輸入樣例2】
25 10
4 2 1 8 10
5 210 8 2 1 4
【輸出樣例】
-1【資料範圍及約定】
對於30% 的資料,1 n 100,1 d 1000,1 hi 1000;
•對於100% 的資料,1 t 100,1 n 103,1 d 106,1 hi 106。
我們不能隨意地將水平位置拉開,因為必須要能夠從最矮的柱子跳到最高的柱子。
其實就相當於有了很多限制條件,顯然這是乙個差分約束系統。
先根據柱子的高度排序(初始化時用結構體記錄高度和位置)
我們約定,在相鄰兩柱子,從下標小的向大的建邊(以下用u(下標小),v(下標大)表示)
我們有兩個約束條件:
1..根據題意:pos[v]-pos[u]+height[v]-height[u]≤d
2..兩個相鄰的柱子之間距離最少為1::pos[v]-pos[u]≥1
整理後得到
pos[v]-pos[u]≤d-(height[v]-height[u])
於是建邊分為兩種:
1.從i 到i+1建邊,長度為 d-(height[v]-height[u])
2.從i+1到i建邊,長度為-1
#include#define maxn 1005using
namespace
std;
struct
node
e[maxn
<<1
];struct
node1
a[maxn];
intt,n,d,tot,flag,st,ed;
int dis[maxn],head[maxn],in
[maxn];
bool
vis[maxn];
queue
q;bool cmp(const node1 &x,const node1 &y)
void add(int u,int v,int
w)int spfa(int st,int ed)//
找最短路 }}
}return
dis[ed];
}int
main()
tot=0,flag=1
; memset(head,
0,sizeof
(head));
sort(a+1,a+n+1
,cmp);
//找到起點和終點
st=min(a[1
].pos,a[n].pos);
ed=max(a[1
].pos,a[n].pos);
for(int i=1;i<=n-1;++i)
add(u,v,d-a[i+1].h+a[i].h);
}if(flag) printf("
%d\n
",spfa(st,ed));
else printf("
-1\n");
}}/*
23 4
3 2 4
3 43 2 6
*/
完結撒花!
差分約束系統
差分約束 若 s a s b k 建一條b到a 的長度為k的邊 若s a s b k 建一條b到a 的長度為 k的邊 是求最小值的最長路 是求最大值的最短路 注意到最短路演算法的鬆弛操作 if d j d i w i j d j d i w i j 這其中的三角形不等式 d j d i w i j ...
差分約束系統
差分約束系統 對於差分不等式,a b c 建一條 b 到 a 的權值為 c 的邊,求的是最短路,得到的是最大值 對於不等式 a b c 建一條 b 到 a 的權值為 c 的邊,求的是最長路,得到的是最小值 存在負環的話是無解 求不出最短路 dist 沒有得到更新 的話是任意解 第三 一種建圖方法 設...
差分約束系統
差分約束系統 x1 x2 0 x1 x5 1 x2 x5 1 x3 x1 5 x4 x1 4 x4 x3 1 x5 x3 3 x5 x4 3 不等式組 1 全都是兩個未知數的差小於等於某個常數 大於等於也可以,因為左右乘以 1就可以化成小於等於 這樣的不等式組就稱作差分約束系統。這個不等式組要麼無解...