日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

字节跳动---万万没想到之抓捕孔连顺

發布時間:2024/4/11 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字节跳动---万万没想到之抓捕孔连顺 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

字節跳動—萬萬沒想到之抓捕孔連順

文章目錄

    • 字節跳動---萬萬沒想到之抓捕孔連順
    • 一、題目描述
    • 二、分析
    • 三、代碼

一、題目描述

我叫王大錘,是一名特工。我剛剛接到任務:在字節跳動大街進行埋伏,抓捕恐怖分子孔連順。和我一起行動的還有另外兩名特工,我提議

  • 我們在字節跳動大街的 N個建筑中選定3個埋伏地點
  • 為了相互照應,我們決定 相距最遠的兩名特工間的距離不超過D。
  • 我特喵是個天才! 經過精密的計算,我們從X種可行的埋伏方案中選擇了一種。這個方案萬無一失,顫抖吧,孔連順!
    ……
    萬萬沒想到,計劃還是失敗了,孔連順化妝成小龍女,混在cosplay的隊伍中逃出了字節跳動大街。只怪他的偽裝太成功了,就是楊過本人來了也發現不了的!

    請聽題:給定N(可選作為埋伏點的建筑物數)、D(相距最遠的兩名特工間的距離的最大值)以及可選建筑的坐標,計算在這次行動中,大錘的小隊有多少種埋伏選擇。
    注意:

  • 兩個特工不能埋伏在同一地點
  • 三個特工是等價的:即同樣的位置組合(A, B, C) 只算一種埋伏方法,不能因“特工之間互換位置”而重復使用
  • 輸入描述:

    第一行包含空格分隔的兩個數字 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; }

    總結

    以上是生活随笔為你收集整理的字节跳动---万万没想到之抓捕孔连顺的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。