有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.神經元 生物學的神經元啟發...