HDU 3440 查分約束

2022-04-08 10:31:31 字數 1300 閱讀 6034

點選開啟鏈結

題意:給個n個不同的高度,乙個人從最低點跳躍,每次可以跳到第乙個比它高的位置,最後跳到最高點,然後每次最多可以跳的距離為d,而且在跳躍時可以在不改變給定順序的情況下移動這些高度,使得最後起始點和終點的位置最遠,

思路:自己想了一會,想的方向錯了,我自己想的方法是將最小高度記為0,最大高度記為n-1,然後寫查分約束方程,這了一會發現條件不足,沒想法了,看了大牛們的解法發現原來以給定的順序直接進行條件就可以了,而且好簡單,因為我們不能調整給定的順序,那麼對於給定的順序就可以有pos(i+1)>=pos(i)+1,那麼可以寫出乙個條件就是i+1-->i連一條權值為-1的邊,還有乙個條件是相鄰兩個要跳躍的距離不可以大於d,可以寫出另乙個方程,而現在條件全部是基於給定的序列,那麼剩下的條件也要在這個基礎進行,右面的點一定是在左邊的點的後面,那麼式子也就很好列出來了,圖建完了,查詢距離就用spfa判環並輸出就行了,對於起點和終點也要在原序列完成,那麼找到位置並處理一下前後即可,因為位置相對的是絕對值,且邊是從前向後建的,那麼起點和終點為什麼換位置就理解了

#include

#include

#include

#include

#include

#include

#include

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

const int inf=0x3f3f3f3f;

const ll inf=0x3f3f3f3f3f3f3f3fll;

const int maxn=1010;

int dis[maxn],cnt[maxn],head[maxn],n,m,k;

bool vis[maxn];

struct edgee[maxn*200];

void add_edge(int u,int v,int w)

int spfa(int st,int en)}}

}if(dis[en]==inf) return -1;

return dis[en];

}struct edge1a[maxn];

bool cmp(const edge1 &a,const edge1 &b)

int st=a[0].pos,en=a[n-1].pos;

if(st>en) swap(st,en);

int ans=spfa(st,en);

printf("case %d: %d\n",cas++,ans);

}return 0;

}

hdu 3440 差分約束

看完題目第一遍,感覺很簡單。當寫完程式跑測試用例的時候,發現第二個總是過不了,然後好好研究了一下測試用例,才知道原來不是程式有問題,而是我的建圖方式錯了。對於這些無序的點,如果高的在右邊,不等式是dis tall dis short d 如果高的在左邊,那麼不等式就要變成dis short dis ...

HDU3440 House Man(差分約束)

題意 有n個高度各不相同的房子排成一條直線,每個房子都佔據乙個點,相鄰兩個房子之間的距離可以改變,但是所有房子的相對位置不能變。有乙個超人能夠在房子之間跳躍,他從最矮的房子開始,依次跳到更高的房頂上。任意兩個高度的次序相鄰的房子之間的距離不能超過d。求最高的和最矮的房子之間的最大距離。思路 我們將房...

《學習筆記》 查分約束系統

定義 如果乙個系統由n個變數和m個約束條件組成,形成m個形如 ai aj k 的不等式 i,j 1,n k為常數 則稱其為差分約束系統 system of difference constraints 亦即,差分約束系統是求解關於一組變數的特殊不等式組的方法。栗子 給出這樣的一組不等式 a b 3 ...