安排機器(5)

2021-09-25 17:59:07 字數 1772 閱讀 6133

有m個任務, 第i個任務需要xi的時間去完成,難度等級為yi。

有n臺機器,每台機器的最長工作時間為zi,機器等級為wi。

對於乙個任務,只能交給一台機器完成,機器的工作時間需》=任務所需時間且機器等級需》=任務難度等級,才可以用這台機器完成這個任務。完成這個任務將獲得200*xi+3*yi的收益。

對於一台機器,每天只能完成乙個任務。

怎樣安排,完成任務數量最大,獲得收益最大。

輸入包括n+m+1行。

n表示機器數量,m表示任務數量。(1 <= n,m <= 100000)。

接下來n行,每行兩個整數zi和wi,分別表示機器工作時間和機器等級。(0 < zi <1000, 0 <= wi <= 100)。

接下來m行,每行兩個整數xi和yi,分別表示任務所需時間和任務等級。(同上)。

輸出兩個整數,分別表示最大完成任務數量和獲得的最大收益。

1 2100 3

100 2

100 1

1 20006

一共有n臺機器,m個任務,最直接方法,窮舉所有可能,則一共擁有n*m種可能,但n和m最大值可能為100000,兩數相乘最大可為100億,複雜度很明顯過高。

所以要對演算法進行優化,可以先將任務的時長和機器的時長分別排序(若時長一樣,則按等級排序),這樣基本保證了所需時間比較長的任務對應著時間比較長的機器,從而避免了把時間比較長的任務安排到時間比較短的機器上,大大降低了不必要的嘗試。

以任務為基準,遍歷所有任務,將任務當作是外層迴圈,任務按照時長從大到小進行遍歷,遍歷到第i個任務時,拿其的時長與機器的時長進行比較,若機器時長》=任務時長,則記錄下來,然後進行任務等級對比,當機器的等級》=任務的等級時,才可以把該任務安排到該機器上,具體操作見**和注釋。

#include #include using namespace std;

struct node

int cmp(node x,node y)

void test()

for(int i = 0;i < m;i++)

//進行排序,按時長進行排序,時長一樣時按照等級排序

sort(arrn,arrn+n,cmp);

sort(arrm,arrm+m,cmp);

int countg[101] = ; //等級計數器,不同等級的個數

int numc = 0; //能完成的任務數量

long long gains = 0; //能獲得的最終收益

int i = 0; //任務角標

int j = 0; //機器角標

int k = 0; //等級角標

for(;i < m;i++)

for(k = arrm[i].g;k <= 100;k++) //滿足等級要求進行遍歷

if(countg[k])

}//一開始是按照時間降序排列,當滿足時間要求時,用countg這個陣列記錄下來,

//然後再進行等級判斷,等級k由小到大公升序遍歷

//而countg這個陣列可以一直使用,當第i個任務遍歷完,則countg時長一定能滿足

//第i+1個任務,因為全部是按照時間降序進行排列。

//所以不論外層迴圈怎麼樣,arrn最多遍歷一次,不受外層迴圈的影響,大大降低了複雜度。

//countg這個陣列一直可以重複使用,內層第二個for迴圈進行判斷,只要滿足條件就break;

}}int main()

騰訊筆試題 安排機器

下面的 只ac了40 我認為是對我的演算法思路對測試資料造成了遺漏 我的思路是先按照時間和等級進行貪心排序,因為時間的影響力比等級大,所以把時間作 為第一排序選擇 然後迴圈選擇機器時間大於任務時間,且機器等級大於任務等級的任務 陣列下標,在計算moreincome和count同時,將機器和任務的資料...

機器學習5

機器學習第六章走起 接著上一章,對於break point 按照前面的規律來看,隨著n的增大,我們的effective n 與pow 2,n 的差距越來越大 bound function 就是成長函式的乙個上限,我們剛才分析的成長函式是對於不同的h給與不同的分析,那我們有個目標,就是我們知道我們的n...

機器學習(5)

神經網路 基礎概念 神經網路 1.定義 神經網路也稱人工神經網路,是一種模仿生物上設神經網路的一種演算法。神經網路是機器學習諸多演算法中的一種,它既可以用來做有監督的任務,如分類 視覺識別等,也可以用作無監督的任務。同時它能夠處理複雜的非線性問題,它的基本結構是神經元。2.神經元 生物學的神經元啟發...