codility上的問題 之三 Beta 2010

2021-06-16 11:21:06 字數 737 閱讀 1897

問題 : y軸上有n個圓,第i個圓的半徑是a[i], 圓心是(0,i),求有多少對圓有公共點(指的是有相交或者內含)。

n的範圍是10^5,半徑範圍[0..2147483647],如果結果大於10^7,返回-1。

要求複雜度:時間複雜度o(nlogn),空間複雜度o(n),

解答: 這個題可以離散化,其實圓是沒有用處的,對每個圓,可以理解為(0,i - a[i])  (0, i + a[i])的線段。我們對每條線段端點,可以定義乙個事件,這條線段進入或者離開。我們按由小到大的順序訪問各個端點,只有當一條新線段進入時,現有的線段條數(我們可以稱為深度)是目前和這條線段相交的線段條數。所以,我們記錄每條線段進入時的深度和即為所求。還要注意當存在相等的值時,即既有線段進入又又線段離開的時候,所有線段進入要在所有線段離開之前,否則計算深度會有問題。我們把進入定義為-1,離開定義1,這樣可以利用pair本身的大小對線段進行排序。還要注意線段的端點範圍可能會超過int。

// you can also use includes, for example:

// #include #include using namespace std;

int solution(const vector&a)

sort(a.begin(), a.end());

for (i = r = d = 0; i < m; ++i)

}else

}return r;

}

Codility上的練習 (9)

1 countsemiprimes 半質數的定義是恰好兩個質數 可以相同 乘積的數,例如4,6,9,10,14,15,21,22,25,26,都是半質數。給定n,長度為m的等長整數陣列p和q,滿足1 p k q k n,求每個區間 p k q k 之間有多少個半質數。函式頭部 vectorsolut...

Codility上的練習(11)

1 ladder 給定兩個等長的陣列a和b,a i 和b i 表示求乙個有a i 級的梯子,每次上1級或者兩級,上到最高端的方法數對2 b i 取餘數的結果。資料範圍 陣列長度 l 1.30000 a中數字範圍 1.l b中數字範圍 1.30 要求複雜度 時間空間都是o l 分析 打表法 我們迴圈可...

Codility上的練習 (14)

1 tieropes 給定n段繩子 乙個正整數陣列,和乙個正整數k,每次只能連線相鄰的兩根繩子,連線好了繩子長度為之前的繩子長度和,並且位置不變,問這麼連線下去,最多能形成多少根長度至少為k的繩子?資料範圍 n 1.10 5 陣列元素和k的範圍 1.10 9 要求複雜度 時間o n 空間o 1 分析...