問題描述
數軸上有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。
輸出格式
輸出乙個數,表示答案。如果答案是整數,只輸出整數部分。如果答案不是整數,輸出時四捨五入保留一位小數。
樣例輸入
2
10 5010
4980 9980
樣例輸出
20
樣例說明
第乙個區間往左移動10;第二個區間往右移動20。
樣例輸入
4
0 4000
3000 5000
5001 8000
7000 10000
樣例輸出
0.5
樣例說明
第2個區間往右移0.5;第3個區間往左移0.5即可。
輸入樣例
4
1000
3000
05000
7000
10000
8000
9000
輸出樣例
1000
排序按右區間排,輸入的時候要處理一下,要乘以2,這樣結果是0.5的時候好算一些,因為兩個整數區間的移動不可能移動0.2,0.3這樣的。二分判斷函式要注意有的區間可以先不用。
#include
#include
#include
using
namespace std;
const
int n=
10000
;const
int inf=
0x3f3f3f3f
;struct nodes[n]
;int n;
bool
cmp(node a,node b)
intjudge
(int x)
,idx=0;
for(i=
0;idx<
20000
&&i=(j==i)
,j=i)
else
}return idx>=
20000;}
intmain()
sort
(s,s+n,cmp)
;int l=
0,r=
20000
;while
(l<=r)
else
} cout<2.0;
return0;
}
試題 歷屆試題 區間移位
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 這個區間內的每乙個點都落於至少乙個區間內。你希望找乙個移動...