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