忙碌又貪心的泥瓦匠

2021-09-29 22:32:40 字數 1635 閱讀 6518

時間限制:1000ms  記憶體限制:1000k

提交次數:8 通過次數:4

題型: 程式設計題   語言: g++;gcc;vc

村里有唯一乙個泥瓦匠叫kemo,很多人需要找kemo修房子、修灶台、造花園……等,大家可以向kemo預約

修葺的時間和工錢。

現在情況是:

1)kemo只有乙個人,不能同時為兩個雇主工作

2)kemo只有幹完乙個雇主家的活才可以在接下來的一天切換到另乙個雇主家裡幹活。未幹完乙份活不可以

離開,不可以為多位雇主交叉時間幹活

3)kemo如果不能在預約的時間那天應約的話,這個雇主的這份錢就掙不到了

kemo比較聰明,他把大家的預約收集好,想讓自己忙碌一陣子,賺最多的錢。現在請你為這個忙碌而又貪心

的kemo設計乙個思路吧。

輸入4行:

第一行,乙個數字,n,表示n個人向kemo預約需要修葺(n<=100)

第二行,n個正數,表示這n個人所需完成修葺的時間的起始點。若時間點為8,表示第8天開始

第三行,n個正數,表示這n個人所需完成修葺的工程天數。若天數為3,表示這一工程必須維持3天完

成(所有工程都可以在第1000天內完成,即起始點+工期<=1000)

第四行,n個正數,表示這n個人能向kemo付出的工錢,工錢以每天計

輸出:忙完這陣子,kemo最多能掙多少錢?

例如:4個人需要找kemo修葺,起始時間、工期和每天的工錢分別是:

1 3 8 4

3 2 3 2

5 6 10 7

則:kemo可以獲得的最大收益為:5*3+10*3+7*2 = 59

4

1 3 8 4

3 2 3 2

5 6 10 7

59

此題標題雖有「貪心」,但勿掉入貪心的陷阱中哦(貪心法是解不了滴)。

每項工程有「起始時間」,「工期」和「工錢數」三個性質。若兩個工程的從起始時間到結束都不相沖

突,就定義這兩個工程為「相容工程」。

做子集樹,根結點為第1層,葉節點為n+1層。子集樹的第i層結點的兩個分支代表第i個工程選或者不選。

用回溯演算法搜尋這n+1層的完全二叉樹。

1)若當前工程和之前已選的工程集合不相容,則剪去該分支,不進行該分支之下的搜尋,返回到上層結點。

2)將所有滿足相容性的可行的葉節點,計算獲得的最大工錢數。

#include #include #include #include using namespace std;

int n;

int c;

int start[101]=;

int day[101]=;

int money[101]=;

int choose[101]=;

int time2[10000]=;

int can=0;

int curmoney=0;

int maxmoney=0;

void backtrack(int i)

can=0;

for(int j=start[i];j<=start[i]+day[i]-1;j++)

10347 忙碌又貪心的泥瓦匠

村里有唯一乙個泥瓦匠叫kemo,很多人需要找kemo修房子 修灶台 造花園 等,大家可以向kemo預約 修葺的時間和工錢。現在情況是 1 kemo只有乙個人,不能同時為兩個雇主工作 2 kemo只有幹完乙個雇主家的活才可以在接下來的一天切換到另乙個雇主家裡幹活。未幹完乙份活不可以 離開,不可以為多位...

又忙碌了乙個月

技術的積累和實戰總是充滿驚喜,轉眼乙個月沒寫部落格了,這個要自我提醒一下。最近一直在深入研究glusterfs 在腦裂情況下的資料不一致問題 需要解決的乙個實際生產問題 也對比了一下一直密切跟蹤的ceph,再次對 物件儲存有了更進一步的認識,還是回到gluster上來吧,核心功能機制在客戶端處理,儲...

忙碌的五一

這個五一過的特別的忙碌,整天7天沒有在家休息,唯一能陪兒子的時間就是晚上回去和早上走之前 兒子現在大了,也懂事了許多,不再任由自己的性子胡鬧了,給他說的話和道理能聽進去一些,但還是有些調皮,經常說些沒有教過他的話,有自己很多的創意和發揮 乙個月沒見兒子了,這次回來發現除了在家曬黑了,身體方面沒什麼太...