1.把所有的區間左右端點讀入,並且端點都乘以2,也就是擴大兩倍,因為後面要二分答案,但是答案又會有0.5的小數字,二分的答案就會是擴大兩倍就會是整數,以便更好二分,只要最後答案/2就可以了
2.區間按右端點排序
3.開始二分答案,記最大移動距離為mid,記當前沒有被覆蓋的區間點:k=0,列舉所有的區間,如果k在[ai-mid,bi+mid]內,就說明能被該區間覆蓋,這裡有貪心,如果能接到左區間端點上,也就是ai+mid<=k,就接到左端點上,此時k更新為k+(bi-ai),如果不能,那麼k就會更新到右端點bi+mid的位置,也就是盡可能往右覆蓋
#include
using
namespace std;
const
int maxn =
20000
;int n;
struct node
;vector reg;
bool
cmp(node x,node y)
bool
check
(int x)}if
(!found || k>=maxn)
break;}
return k>=maxn;
}int
main()
);}sort
(reg.
begin()
,reg.
end(
),cmp)
;int l =
0,r = maxn;
double ans =0;
while
(l<=r)
else
} ans/
=2.0
; cout
}
歷屆試題 區間移位
問題描述 數軸上有n個閉區間d1,dn。其中區間di用一對整數 ai,bi 來描述,滿足ai bi。已知這些區間的長度之和至少有10000。所以,通過適當的移動這些區間,你總可以使得他們的 並 覆蓋 0,10000 也就是說 0,10000 這個區間內的每乙個點都落於至少乙個區間內。你希望找乙個移動...
試題 歷屆試題 k倍區間
試題 歷屆試題 k倍區間 資源限制 時間限制 2.0s 記憶體限制 256.0mb 問題描述 給定乙個長度為n的數列,a1,a2,an,如果其中一段連續的子串行ai,ai 1,aj i j 之和是k的倍數,我們就稱這個區間 i,j 是k倍區間。你能求出數列中總共有多少個k倍區間嗎?輸入格式 第一行包...
試題 歷屆試題 連號區間數
提交此題 評測記錄 資源限制 時間限制 1.0s 記憶體限制 256.0mb 問題描述 小明這些天一直在思考這樣乙個奇怪而有趣的問題 在1 n的某個全排列中有多少個連號區間呢?這裡所說的連號區間的定義是 如果區間 l,r 裡的所有元素 即此排列的第l個到第r個元素 遞增排序後能得到乙個長度為r l ...