問題描述:
說有一台機器,上面有m個儲存空間。然後有n個請求,第i個請求計算時需要佔r[i]個空間,儲存計算結果則需要佔據o[i]個空間(其中 o[i]題解:
假設可以滿足所有請求,並且處理請求的順序是:r1,r2,……r(n-1),r(n),那麼儲存完所有的請求結果後,剩餘的儲存空間為l= m-∑o[i]。
如果假設成立,必須滿足:針對請求r(n),一定有l+o[r(n)]>=r[r(n)]。同理,針對r(n-1),一定有
l+o[r(n)] + o[r(n-1)] >= r[r(n-1)],依次類推。於是,證明假設成立就轉化為:針對假設中的每乙個請求r(i),都有l+∑o[r(n-j)]>=r[r(i)],其中i>=j>=0。相應的,原問題也就轉化成從尋找這樣的r(i)。
既然如此,從尋找r(n)開始,這時候有n個選擇(r[1]~r[n]),那麼選擇哪乙個呢?如上所說,我們選擇的原則是滿足l+o[r(n)]>=r[r(n)],即l>=r[r(n)]-o[r(n)]。所以將所有的選擇按照r[r(n)]-o[r(n)]從小到大排序,每次選擇時試探r[r(n)]-o[r(n)]最小的值,如果最小值都不能滿足,那麼已經證明假設不成立,否則繼續探測n-1,n-2……1,直到出現不能滿足的情況,或者證明假設成立。
時間複雜度:nlogn(事先的排序)+n
view plaincopy to clipboardprint?
public class schedule ;
static final int o=;
static final int n = 8;
static final int m = 50;
static int index;
public schedule()
/**
* part step of qusort
*/
int part(int s,int e)
return l;
}
/**
* quick-sort
*/
void qsort(int s,int e)
}
/**
* sum o[0~n-1]
*/
int sum()
if(i == n)
t.display();
else
system.out.println("cant be scheduled");
}
} public class schedule ;
static final int o=;
static final int n = 8;
static final int m = 50;
static int index;
public schedule()
/*** part step of qusort
*/int part(int s,int e)
return l;
}/**
* quick-sort
*/void qsort(int s,int e)
}/**
* sum o[0~n-1]
*/int sum()
if(i == n)
t.display();
else
system.out.println("cant be scheduled");}}
下標處理問題
下標處理問題 主要是針對於插入排序演算法寫的程式,其他情況可以借鑑這些思路。數學上或者通常意義上,下標都是從1開始的,但是在多數程式語言裡面陣列下標都是從0開始的,這就很惱火了,簡單乙個下標處理起來卻異常麻煩!請看 例如 1 典型的陣列下標越界問題 假設有個陣列 a 0 a 1 我們要用插入法排序,...
ORACLE 異常處理問題處理
create or replace procedure pro people as begin select per id into v per id from people where id i id exception when no data found then v per id 1 whe...
應急處理問題思路
做資料庫時間長了,可能會經常去客戶那裡進行應急處理問題,特別是客戶急急忙忙的給你打 說資料庫執行很慢,甚至說資料庫無法使用了,讓你到客戶現場去解決問題,這個可能是大家最不想出現的,因為這個很急,到客戶現場需要趕緊解決問題,那麼如果你遇到了這個問題,也不要慌,還是按照自己的思路去解決,只不過要思路敏捷...