幫牛牛找工作

2021-10-05 09:41:14 字數 3897 閱讀 5758

牛牛找工作這個題目是2023年網易校招編**題。本人菜鳥,解這個題解了一天,沒有成果,也不知道**出了錯。後來乾脆去找已經成功提交的**。對著別人的**一行一行碼。然後自己簡單修改一下。現在回顧反思一下解題思路。

題目描述

為了找到自己滿意的工作,牛牛收集了每種工作的難度和報酬。牛牛選工作的標準是在難度不超過自身能力值的情況下,牛牛選擇報酬最高的工作。在牛牛選定了自己的工作後,牛牛的小夥伴們來找牛牛幫忙選工作,牛牛依然使用自己的標準來幫助小夥伴們。牛牛的小夥伴太多了,於是他只好把這個任務交給了你。

每個輸入包含乙個測試用例。

每個測試用例的第一行包含兩個正整數,分別表示工作的數量

n(n<=100000)

和小夥伴的數量

m(m<=100000)

。接下來的

n行每行包含兩個正整數,分別表示該項工作的難度

di(di<=1000000000)

和報酬pi(pi<=1000000000)

。接下來的一行包含

m個正整數,分別表示

m個小夥伴的能力值

ai(ai<=1000000000)

。保證不存在兩項工作的報酬相同。

對於每個小夥伴,在單獨的一行輸出乙個正整數表示他能得到的最高報酬。乙個工作可以被多個人選擇。

示例1

3 31 100

10 1000

1000000000 1001

9 10 1000000000

1001000

1001

本題的解題思路分為5步:

1. 按格式讀取工作資料和需要找工作的人員數量;

2.對工作資料按照難度進行排序;

3.重新分配每個工作難度對應的薪水;

4.讀取員工的能力,並找到適合其能力的最高薪水;

5.輸出每個員工的最高薪水。

接下來我一步一步地對每一步的細節進行解釋說明。

1. 按格式讀取工作資料和需要找工作的人員數量;

先看輸入描述:

每個輸入包含乙個測試用例。

每個測試用例的第一行包含兩個正整數,分別表示工作的數量

n(n<=100000)

和小夥伴的數量

m(m<=100000)

。接下來的

n行每行包含兩個正整數,分別表示該項工作的難度

di(di<=1000000000)

和報酬pi(pi<=1000000000)。

第一行資料有兩個正整數,分別為工作種類n和找工作的人數m。根據m和n的大小條件限制。可以用int (32位機器上可以表示的資料範圍為2^

-31~

(2^31

-1))型的資料表示。有了工作的數量n,就可以將工作資料讀取到記憶體中。這裡資料形式使用了結構體,工作結構體包含了兩個成員,第乙個成員是difficulty表示工作難度,第二個成員salary表示薪水數量。二者都採用整型定義。在這裡使用了malloc函式開闢了可以容納工作資料的乙個位址空間。這個空間裡用於存放工作資料結構體。首位址交給了joblist結構體指標變數。然後以此按照給定格式將工作資料存到結構體陣列中去。這種使用malloc開闢空間的做法減少了空間浪費,需要多少,開闢多少。

2.對工作資料按照難度進行排序

拿到了工作資料之後,為了方便後來的比較。按照難度,將工作資料排個序。容易的在低位址,難的在高位址。這裡順序的公升序降序無所謂,只是**表示的不同。本文使用了從低到高的排序方法。這裡使用了qsort庫函式。

qsort函式有四個引數:1.排序後存放資料的首位址,一般放乙個陣列的首位址;2.需要排序元素的數量,對陣列中所有的元素排序,放上陣列元素的數量即可;3.被排序的各個元素所占用的位元組大小;4

指向函式的指標,用於確定排序的順序(需要使用者自定義乙個比較函式)這個函式的型別和形參是固定的。函式體可以根據需要自定義。

int

comp

(const void

*a,const void

*b)

本例定義如上,輸入引數作為工作資料的結構體指標。比較兩個結構體指標指向的結構體中difficulty即工作難度的大小。當a1所指向的結構體成員difficulty大於a2所指向的結構體成員difficulty時,返回1;兩者相等時,返回0;a1所指向的結構體成員difficulty小於a2所指向的結構體成員difficulty時,返回-1。這是公升序排列。反之,則為降序排列。

3.重新分配每個工作難度對應的薪水;

這個思路是這樣的。輸入的工作資料中,有可能出現工作難度很大,但是薪水比較低的情況。這種工作往往不是最好的工作。所以,需要將工作難度和薪水相匹配。如果工作a的工作難度大於工作b的難度,那麼工作a的薪水也應當大於等於工作b。由於排序中,工作難度是遞增的,所以,薪水是不減的。工作難度和薪水相匹配之後,有利於依據工作能力來尋找最高的薪水。

4.讀取員工的能力,並找到適合其能力的最高薪水;

這是關鍵的一步。這裡的思路決定了整個程式的時間複雜度。這裡使用了二分法。

每獲取乙個人的能力水平之後。首先定義起點位置start=0和終點位置end=n。計算出中間點mid=(start+end)/2的難度水平。此時有三種情況,可以分別處理。

(1).此人的能力恰好能勝任mid這一位置的難度,不能勝任下一位置的難度。由於薪水是不減的,所以,此人能力範圍能所能獲得的最高薪水為mid位置的薪水。跳出此次尋找。輸出其最高薪水。進行下乙個人的尋找階段。

(2).此人能力小於中間點mid位置的工作難度。此時起點不變,將mid-1作為終點。更新mid。

(3).此人能力大於中間點mid位置的工作難度。此時終點不變,將mid+1作為起點。更新mid。

當起點位置大於終點位置的時候,此人的能力值不等於任何乙個工作的難度。介於mid左右兩個工作難度之間。跳出此次尋找。

5.輸出每個員工的最高薪水。

每一次尋找結束時。有兩種情況結束尋找(1).此人的能力等於mid位置的工作難度;(2)。此人的能力在mid-1到mid+1兩個工作的難度之間。所以,對其能力與mid位置的工作難度比較之後,即可判斷此人所能獲得的最大薪水是mid位置的薪水還是mid-1位置的薪水。

完整原始碼如下:

#include

#include

int

comp

(const void

* _a

, const void

* _b)

;typedef struct

_job

job;

int

main

() /******

按照工作難度排序,從容易到複雜

********/

qsort(joblist,n

,sizeof

( job ),

comp)

;/*****

對每個工作難度對應的薪水重新分配

*******/

temp=joblist[0].

salary

;for

(int

i = 1;

i < n

; ++i)

else

}/*****

讀取員工的能力並找到適合其能力的最高薪水

*****/

for

(int

j = 0;

j < m

; ++j)

else if

(tempdifficulty)

else

}/***

輸出每個員工的最高薪水

********/

if (temp>=joblist[mid].

difficulty)

else

}return 0;

}int

comp

(const void

*a,const void

*b)

牛牛找工作

題目描述 為了找到自己滿意的工作,牛牛收集了每種工作的難度和報酬。牛牛選工作的標準是在難度不超過自身能力值的情況下,牛牛選擇報酬最高的工作。在牛牛選定了自己的工作後,牛牛的小夥伴們來找牛牛幫忙選工作,牛牛依然使用自己的標準來幫助小夥伴們。牛牛的小夥伴太多了,於是他只好把這個任務交給了你。輸入描述 每...

牛牛找工作(排序)

題目沒有給出時間範圍,第一次寫出之後t了。題目鏈結 下面是超時做法 時間複雜度為o mn include using namespace std int n,m define ll long long typedef pair pii pair a 100005 pair b 100005 bool...

牛客網 牛牛找工作

時間限制 2秒 空間限制 65536k 為了找到自己滿意的工作,牛牛收集了每種工作的難度和報酬。牛牛選工作的標準是在難度不超過自身能力值的情況下,牛牛選擇報酬最高的工作。在牛牛選定了自己的工作後,牛牛的小夥伴們來找牛牛幫忙選工作,牛牛依然使用自己的標 准來幫助小夥伴們。牛牛的小夥伴太多了,於是他只好...