乙個碼頭中有n艘船和n個木樁,船的長度為2*x,碼頭的寬度為m,n個木樁的位置(相對碼頭左岸的位置)會在資料中給出。船和船之間不能重疊,即每艘船的船頭不能超過上一艘船的船尾,當然也不能超出碼頭的兩岸。船和木樁之間用繩子連線,並且1個木樁只能栓1條船,繩子的一頭拴在木樁上,另一頭拴在船的中間。而船中間到木樁的距離,就是所需的繩子的長度。由你根據給出的條件,排列船的位置,使得所用到的最長的繩子最短。輸出這個最短的長度,如果碼頭排不下所有船則輸出-1。
例如:n = 3, x = 2, m = 16。三個木樁的位置為:1 3 14。船的長度為2*x = 4。你可以將三艘船放在2 6 14(指的是船中間所處的位置),這樣船和船之間既沒有重疊,並且所用的最長的繩子最短,長度為3,即第2艘船到第二根木樁的距離。
input
第1行:3個數n x m,中間用空格分隔(1 <= n <= 50000, 1 <= x <= 10^9, 1 <= m <= 10^9)。output第2 - n + 1行:每行1個數pi,對應木樁的位置(0 <= pi <= pi+1 <= m),並且給出的資料是有序的。
輸出最長繩子的最小值。如果碼頭排不下所有船則輸出-1。input示例
3 2 1613output示例14
3解題思路:
一看到最長的繩子最短,就想到了二分,確實,這題二分是可以解決的,可是還有更好的的o(n)的方法,想想也挺有趣的。
首先把所有的小船都從左到右併排排列,再把他們向右移動,但是移多少是個問題,移多了,少了都不是最小值,在小船
向右移動的過程主要看右邊木樁到船心的最小值,可
以用最小值來中和,取他倆的平均值,這樣最小的不至於太小,最大的也
不會太大。
**:
#include #include #include #include using namespace std;
const int maxn=50000+100;
int a[maxn];
int b[maxn];//記錄第i個及i個之後的木樁到船心的最小距離
int bbs(int x)
int main()
ans=max(ans,bbs(a[i]-(i*2*x+x)-cur));
}cout<
}return 0;
}
51nod 1243 排船的問題
1243 排船的問題 codility 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 乙個碼頭中有n艘船和n個木樁,船的長度為2 x,碼頭的寬度為m,n個木樁的位置 相對碼頭左岸的位置 會在資料中給出。船和船之間不能重疊,即每艘船的船頭不能超過上一艘船的船尾,當...
51nod 1243 排船的問題
1243 排船的問題 codility 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 乙個碼頭中有n艘船和n個木樁,船的長度為2 x,碼頭的寬度為m,n個木樁的位置 相對碼頭左岸的位置 會在資料中給出。船和船之間不能重疊,即每艘船的船頭不能超過上一艘船的船尾,當...
51NOD 1243 排船問題 二分
51nod1243排船問題 題意 一 個碼 頭中有n 艘船和n 個木樁,船的長度 為2 x 碼頭的 寬度為m 乙個碼頭中有n艘船和n個木樁,船的長度為2 x,碼頭的寬度為m 乙個碼頭中有 n艘船和 n個木樁 船的長 度為2 x,碼頭 的寬度為mn個 木樁的位 置 相對 碼頭左岸 的位置 會在資料 中...