滴滴2017校招程式設計題 餐館

2021-08-16 18:24:44 字數 1508 閱讀 6438

題目描述:

某餐館有n張桌子,每張桌子有乙個引數:a 可容納的最大人數; 有m批客人,每批客人有兩個引數:b人數,c預計消費金額。 在不允許拼桌的情況下,請實現乙個演算法選擇其中一部分客人,使得總預計消費金額最大

輸入描述:

輸入包括m+2行。 第一行兩個整數n(1 <= n <= 50000),m(1 <= m <= 50000) 第二行為n個引數a,即每個桌子可容納的最大人數,以空格分隔,範圍均在32位int範圍內。 接下來m行,每行兩個引數b,c。分別表示第i批客人的人數和預計消費金額,以空格分隔,範圍均在32位int範圍內。

輸出描述:

輸出乙個整數,表示最大的總預計消費金額
輸入示例:

3 5
2 4 2
1 3 3 5 3 7 5 9 1 10
輸出示例:

20

既然題目要求總消費金額最大,我們就對消費金額從大到小進行選擇,這是很明顯的,那麼對於當前顧客怎麼去安排桌子呢?桌子容量小於所需容量的肯定是不行的,把這些桌子排除後我們發現剩下的桌子都是滿足要求的,所以我們只需要從剩下的當中選乙個容量最小的桌子就行了,因為最小的已經夠用了,選大了相當於浪費;選出滿足要求的桌子之後一定要把這個桌子刪除。這樣我們就得出了這題的演算法,第一步把顧客的資訊存入乙個結構體陣列,然後對此陣列按消費金額從大到小排序;第二步對當前顧客查詢乙個滿足要求的最小桌子,如果找到了就把這個桌子刪除,然後更新結果,沒找到就看下乙個顧客。現在的關鍵就是怎麼去尋找滿足要求的最小桌子,把這個問題解決了這題就解決了。了解樹狀陣列的人都知道這種資料結構能在logn時間內進行區間求和和單點更新,也能在logn時間內查詢第k大的數,我們先求出比此時容量小的總桌子數量,設為sum,然後只要找出第sum+1個桌子就行了,再把找到的桌子給刪掉,這三步操作都能在logn時間內完成,所以總時間複雜度為nlogn+mlogm。此外,因為樹狀陣列的下標就是表示金額,題目給的金額太大,所以一定要進行離散化處理。下面是c++**。

#include#includeusing namespace std;

struct node

arr[50005];

bool operator<(const node &l,const node &r)

//把容量轉化為對應的標號

int binary(int target)

{ int low=0,high=len,mid;

while(low>1;

if(b[mid]==target)

return mid;

b[mid]=0;--i)

{ if(ret+(1<=0;--i)

{ int pos=binary(arr[i].num),k=sum(pos-1)+1;

int ret=findkth(k);

if(ret

滴滴附加題(2018校招)

題目大意,有n個路口,r條路,每條路可以雙向走,希望求得從第乙個路口走到第n個路口需要的次最短路徑。輸入 第一行 兩個正整數,r和n 第二行到第r 1行每行輸入三個正整數,分別為起始路口號 終點路口號和距離。輸出 次最短距離。輸入樣例 4 4 1 2 100 2 3 150 2 4 200 3 4 ...

2023年校招題

牛牛有乙個魚缸。魚缸裡面已經有n條魚,每條魚的大小為fishsize i 1 i n,均為正整數 牛牛現在想把新捕捉的魚放入魚缸。魚缸內存在著大魚吃小魚的定律。經過觀察,牛牛發現一條魚a的大小為另外一條魚b大小的2倍到10倍 包括2倍大小和10倍大小 魚a會吃掉魚b。考慮到這個,牛牛要放入的魚就需要...

滴滴出行2017秋招筆試 餐館消費問題

某餐館有n張桌子,每張桌子有乙個引數 a 可容納的最大人數 有m批客人,每批客人有兩個引數 b人數,c預計消費金額。在不允許拼桌的情況下,請實現乙個演算法選擇其中一部分客人,使得總預計消費金額最大。輸入描述 輸入包括m 2行。第一行兩個整數n 1 n 50000 m 1 m 50000 第二行為n個...