1.【題目描述】
我叫王大錘,是一名**。我剛剛接到任務:在位元組跳動大街進行埋伏,抓捕****孔連順。和我一起行動的還有另外兩名**,我提議我們在位元組跳動大街的 n 個建築中選定 3 個埋伏地點。為了相互照應,我們決定相距最遠的兩名**間的距離不超過 d。
我特喵是個天才! 經過精密的計算,我們從 x 種可行的埋伏方案中選擇了一種。這個方案萬無一失,顫抖吧,孔連順!
……萬萬沒想到,計畫還是失敗了,孔連順化妝成小龍女,混在 cosplay 的隊伍中逃出了位元組跳動大街。只怪他的偽裝太成功了,就是楊過本人來了也發現不了的!
請聽題:給定 n(可選作為埋伏點的建築物數)、d(兩兩埋伏點直接最大的距離)以及可選建築的座標,計
算在這次行動中,大錘的小隊有多少種埋伏選擇。
輸入描述:
第一行包含空格分隔的兩個數字 n 和 d(1 ≤ n ≤ 1000000; 1 ≤ d ≤ 1000000)
第二行包含 n 個建築物的的位置,每個位置用乙個整數(取值區間為[0, 1000000])表示,從小到大排列
(將位元組跳動大街看做一條數軸)
輸出描述:
乙個數字,表示不同埋伏方案的數量。結果可能溢位,請對 99997867 取模
輸入樣例 1:
4 31 2 3 4
輸出樣例 1: 4
ps:可選方案 (1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)
輸入樣例 2:
5 19
1 10 20 30 50
輸出樣例 2: 1
ps: 可選方案 (1, 10, 20)
2.【問題分析】
可以從左到右遍歷所有位置,對於陣列中第 i 個建築,pos[i]是其座標值,假設第乙個**安插在這裡,計算乙個最遠的安全座標值 ,x= pos[i] + d,可以通過二分查詢右側最後乙個比 x 小的陣列下標 j,使得,pos[j] <= x < pos[j + 1]。這樣,從 i 到 j 的這段區間,選定 i 點,然後任選兩個點,都是合法的組合。計算乙個排列組合數 c(j - i, 2)。
3.【**實現】
binarysearch.h
template static rank binsearch3(t* a, t const & e, rank lo, rank hi)
//成功查詢不能提前終止
return --lo; //迴圈結束時,lo為大於e的元素的最小秩,故lo - 1即不大於(小於等於)e的元素的最大秩
} //有多個命中元素時,總能保證返回秩最大者;查詢失敗時,能夠返回失敗的位置
main.cpp
#include#include"binarysearch.h"
using namespace std;
/*萬萬沒想到之抓捕孔連順
4 31 2 3 4
5 19
1 10 20 30 50
*/#define mod 99997867
//求排列組合c(n,2)
long long c(long long n)
return (n - 1) * n / 2;
}int main()
for (int i = 0; i < n; ++i)
cout << count % 99997867<4.【執行結果】
萬萬沒想到之抓捕孔連順
題目描述 我叫王大錘,是一名 我剛剛接到任務 在位元組跳動大街進行埋伏,抓捕 孔連順。和我一起行動的還有另外兩名 我提議 我們在位元組跳動大街的n個建築中選定3個埋伏地點。為了相互照應,我們決定相距最遠的兩名 間的距離不超過d。我特喵是個天才 經過精密的計算,我們從x種可行的埋伏方案中選擇了一種。這...
程式設計題 萬萬沒想到之抓捕孔連順
題目 我叫王大錘,是一名 我剛剛接到任務 在位元組跳動大街進行埋伏,抓捕 孔連順。和我一起行動的還有另外兩名 我提議 我們在位元組跳動大街的n個建築中選定3個埋伏地點。為了相互照應,我們決定相距最遠的兩名 間的距離不超過d。我特喵是個天才 經過精密的計算,我們從x種可行的埋伏方案中選擇了一種。這個方...
位元組跳動 萬萬沒想到之抓捕孔連順
我叫王大錘,是一名 我剛剛接到任務 在位元組跳動大街進行埋伏,抓捕 孔連順。和我一起行動的還有另外兩名 我提議 1.我們在位元組跳動大街的n個建築中選定3個埋伏地點。2.為了相互照應,我們決定相距最遠的兩名 間的距離不超過d。我特喵是個天才 經過精密的計算,我們從x種可行的埋伏方案中選擇了一種。這個...