歷屆試題 區間移位

2021-10-25 17:56:08 字數 1557 閱讀 8510

問題描述

數軸上有n個閉區間d1,…,dn。其中區間di用一對整數[ai, bi]來描述,滿足ai < bi。已知這些區間的長度之和至少有10000。所以,通過適當的移動這些區間,你總可以使得他們的「並」覆蓋[0, 10000]——也就是說[0, 10000]這個區間內的每乙個點都落於至少乙個區間內。

你希望找乙個移動方法,使得位移差最大的那個區間的位移量最小。

具體來說,假設你將di移動到[ai+ci, bi+ci]這個位置。你希望使得maxi |ci|  最小。

輸入格式

輸入的第一行包含乙個整數n,表示區間的數量。

接下來有n行,每行2個整數ai,  bi,以乙個空格分開,表示區間[ai, bi]。保證區間的長度之和至少是10000。

輸出格式

輸出乙個數,表示答案。如果答案是整數,只輸出整數部分。如果答案不是整數,輸出時四捨五入保留一位小數。

樣例輸入

210 5010

4980 9980

樣例輸出

20樣例說明

第乙個區間往左移動10;第二個區間往右移動20。

樣例輸入

40 4000

3000 5000

5001 8000

7000 10000

樣例輸出

0.5樣例說明

第2個區間往右移0.5;第3個區間往左移0.5即可。

資料規模和約定

對於30%的評測用例,1 ≤ n ≤ 10;

對於100%的評測用例,1 ≤ n ≤ 10000,0 ≤ ai < bi  ≤ 10000。

//這裡要確定的一件事是小數點最小的就是0.5,因為將1分為兩部分肯定有一部分的小數大於0.5!!! 

//這裡要乘2倍,不然無法出現小數點

#include

#include

#include

#include

using

namespace std;

int n;

struct node

;vector reg;

bool

cmp(node x,node y)

bool

check

(int x)

//核心函式 }if

(!found||k>=

20000

)break;}

return k>=

20000;}

intmain()

sort

(reg.

begin()

,reg.

end(

),cmp)

;//從左往右查詢則需要右結點進行排列

int l=

0,r=

20000

,mid;

double ans=0;

//可能不移動

while

(l<=r)

//注意二分條件包含等於

else

} ans/

=2.0

; cout

}

試題 歷屆試題 區間移位

1.把所有的區間左右端點讀入,並且端點都乘以2,也就是擴大兩倍,因為後面要二分答案,但是答案又會有0.5的小數字,二分的答案就會是擴大兩倍就會是整數,以便更好二分,只要最後答案 2就可以了 2.區間按右端點排序 3.開始二分答案,記最大移動距離為mid,記當前沒有被覆蓋的區間點 k 0,列舉所有的區...

歷屆試題 區間移位 藍橋杯 二分 貪心

time limit per test memory limit per test input output 1.5 seconds 256 megabytes standard input standard output description 數軸上有n個閉區間d1,dn。其中區間di用一對整數...

試題 歷屆試題 區間移位(二分求最大值最小)

問題描述 數軸上有n個閉區間d1,dn。其中區間di用一對整數 ai,bi 來描述,滿足ai bi。已知這些區間的長度之和至少有10000。所以,通過適當的移動這些區間,你總可以使得他們的 並 覆蓋 0,10000 也就是說 0,10000 這個區間內的每乙個點都落於至少乙個區間內。你希望找乙個移動...