字节跳动---万万没想到之抓捕孔连顺
字節(jié)跳動(dòng)—萬(wàn)萬(wàn)沒(méi)想到之抓捕孔連順
文章目錄
- 字節(jié)跳動(dòng)---萬(wàn)萬(wàn)沒(méi)想到之抓捕孔連順
- 一、題目描述
- 二、分析
- 三、代碼
一、題目描述
我叫王大錘,是一名特工。我剛剛接到任務(wù):在字節(jié)跳動(dòng)大街進(jìn)行埋伏,抓捕恐怖分子孔連順。和我一起行動(dòng)的還有另外兩名特工,我提議
我特喵是個(gè)天才! 經(jīng)過(guò)精密的計(jì)算,我們從X種可行的埋伏方案中選擇了一種。這個(gè)方案萬(wàn)無(wú)一失,顫抖吧,孔連順!
……
萬(wàn)萬(wàn)沒(méi)想到,計(jì)劃還是失敗了,孔連順化妝成小龍女,混在cosplay的隊(duì)伍中逃出了字節(jié)跳動(dòng)大街。只怪他的偽裝太成功了,就是楊過(guò)本人來(lái)了也發(fā)現(xiàn)不了的!
請(qǐng)聽(tīng)題:給定N(可選作為埋伏點(diǎn)的建筑物數(shù))、D(相距最遠(yuǎn)的兩名特工間的距離的最大值)以及可選建筑的坐標(biāo),計(jì)算在這次行動(dòng)中,大錘的小隊(duì)有多少種埋伏選擇。
注意:
輸入描述:
第一行包含空格分隔的兩個(gè)數(shù)字 N和D(1?≤?N?≤?1000000; 1?≤?D?≤?1000000)第二行包含N個(gè)建筑物的的位置,每個(gè)位置用一個(gè)整數(shù)(取值區(qū)間為[0, 1000000])表示, 從小到大排列(將字節(jié)跳動(dòng)大街看做一條數(shù)軸)輸出描述:
一個(gè)數(shù)字,表示不同埋伏方案的數(shù)量。結(jié)果可能溢出,請(qǐng)對(duì) 99997867 取模輸入例子1:
4 3 1 2 3 4輸出例子1:
4例子說(shuō)明1:
可選方案 (1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)輸入例子2:
5 19 1 10 20 30 50輸出例子2:
1例子說(shuō)明2:
可選方案 (1, 10, 20)二、分析
主要思想是固定一個(gè)位置,然后根據(jù)距離D來(lái)進(jìn)行剪枝
- 首先n個(gè)位置是從小到大排過(guò)序的(題意)
- 在n個(gè)位置的某個(gè)位置i(i從0開(kāi)始,i >= 2)開(kāi)始判斷,從他前面選中2個(gè)符合條件的要求的個(gè)數(shù),這些個(gè)數(shù)在n遍歷過(guò)程累加就是最終結(jié)果。
- 如果聽(tīng)著懵懵的,就看下面:
- 假如沒(méi)有距離D的限制條件;在i的位置確定后,其前面有0到i-1共i個(gè)位置。就相當(dāng)于從i個(gè)位置里面選2個(gè)位置(組合)
- A、最重要的點(diǎn)是如何剔除距離>d的
- 定義一個(gè)變量j,用來(lái)判斷當(dāng)前i位置到j(luò)位置的距離D的情況,開(kāi)始的初始值為0,代表從第一個(gè)位置開(kāi)始判斷,如果最大值pos(i)-pos(j)> d,說(shuō)明j之前的所有位置到當(dāng)前 i 位置的距離都>d.
- 如果最大值pos(i)-pos(j)< d,就滿足最遠(yuǎn)的距離不超過(guò)D,j表示當(dāng)前位置i到第一次出現(xiàn)距離小于D的位置,也就是j之前的位置到當(dāng)前位置的距離都大于D,這些要剔除掉,j位置是第一個(gè)滿足題意的位置。所以最終是i - j個(gè)滿足題意的距離中選2個(gè)位置.
總結(jié):就是一個(gè)組合題, 相當(dāng)于第i個(gè)固定, 然后從i前邊的i-j個(gè)里邊選2個(gè)
三、代碼
#include <iostream> #include <vector> using namespace std;//該函數(shù)用來(lái)計(jì)算n個(gè)位置里面選2個(gè)的所有情況 long long C_N_2(long long n) {return (n-1) * n / 2; }int main() {//要用long long類(lèi)型,否則會(huì)越界long long n, d, count = 0;cin>> n>> d;//存儲(chǔ)N個(gè)建筑的位置vector<long long> v(n);//輸入/遍歷判斷int j = 0;//標(biāo)記滿足題意的距離D的最左邊下表for (int i = 0; i < n; i++) {cin>> v[i];//如果當(dāng)前下標(biāo)大于等于2(i >= 2),從0開(kāi)始的,因?yàn)橹辽儆?個(gè)位置嘛//如果v[i] - v[j]) > d代表當(dāng)前位置到j(luò)的距離超過(guò)D,不滿足情況//需要增大最左下標(biāo)jwhile (i >= 2 && (v[i] - v[j]) > d) {j++;}//走到這里代表j位置到當(dāng)前位置i的距離是剛好小于等于D的(滿足最大的情況)//結(jié)果就是從i - j中間的位置中選2個(gè)位置count += C_N_2(i - j);}cout << count % 99997867; return 0; }總結(jié)
以上是生活随笔為你收集整理的字节跳动---万万没想到之抓捕孔连顺的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 字节跳动---万万没想到之聪明的编辑
- 下一篇: Union-Find 并查集算法详解