牛牛找工作這個題目是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 為了找到自己滿意的工作,牛牛收集了每種工作的難度和報酬。牛牛選工作的標準是在難度不超過自身能力值的情況下,牛牛選擇報酬最高的工作。在牛牛選定了自己的工作後,牛牛的小夥伴們來找牛牛幫忙選工作,牛牛依然使用自己的標 准來幫助小夥伴們。牛牛的小夥伴太多了,於是他只好...