今早任務——貪心算法,Python代碼實現算法課的作業。
磁帶最優存儲問題
設有n 個程序{1,2,…, n }要存放在長度爲L的磁帶上。程序i存放在磁帶上的長度是Li, 1≤i≤n。這n 個程序的讀取概率分別是p1,p2,…,pn,且p1+p2+…+pn = 1。如果將這n 個程序按 1,2,…,n 的次序存放,則讀取程序i所需的時間tr=c*(P1×L1+P2×L2+…+Pr×Lr)。這n 個程序的平均讀取時間爲 t1+t2+…+tn。實際上第k個程序的讀取概率爲ak/(a1+a2+…+an)。對所有輸入均假定c=1。磁帶最優存儲問題要求確定這n個程序在磁帶上的一個存儲次序,使平均讀取時間達到最小。試設計一個解此問題的算法,並分析算法的正確性和計算複雜性。
要求:先寫出貪心策略,問題建模,Python編寫代碼,測試數據,測試結果。
貪心策略
每個程序的讀取時間都應該找最短
問題模型
- 計算每個程序的長度和讀取概率的乘積。
- 對1.產生的結果進行排序。
- 當訪問次序確定時,求出每個程序的訪問時間。
- 求出n個程序的平均讀取時間。
輸入:
第一行一個整數 n
每行有兩個整數ai,bi分別表示程序存放在磁帶上的長度和讀取概率。
輸出:
一個結果 表示計算出的最小平均讀取時間。
python實現代碼
def Sort(a):
ans=True
flag=len(a)-1
while flag>0 and ans:
ans=False
for i in range(flag):
if a[i]>a[i+1]:
ans=True
temp=a[i]
a[i]=a[i+1]
a[i+1]=temp
flag-=1
def greed():
for i in range(n):
# print(i)
t[i]=a[i]*b[i]
# print(t[i])
Sort(t)
# for i in range(n):
# print(t[i])
for i in range(1,n):
t[i]+=t[i-1]
# print(t[i-1])
to=int(0)
tp=float(0.0)
for i in range(n):
to+=t[i]
tp+=b[i]
# print(to)
# print(tp)
w=float(to)/tp
print(w)
# def main():
# if __name__=="__main__":
n= int(input())
i=int(0)
w=float(0.0)
t=[0]*n#
a=[0]*n#
b=[0]*n#
for i in range(n):
a[i],b[i]=map(int,input().split(' '))
greed()
# print(a)
# print(b)
# 5
# 71 872
# 46 452
# 9 265
# 73 120
# 35 85
# 結果
# 85.6193
Python知識小結
回顧Python的知識
列表
- 清空是 t=[0]*n
- for i in range(1,n):# 從1開始,到n-1 左閉右開
- a[i],b[i]=map(int,input().split(’ '))//列表輸入 兩個列表一起 就是 2 4 這個格式的輸入
- a=a = list(map(int, input().split(’ '))) # 單個列表的輸入
關於Python sort
- list .sort(reverse=True) 降序 排序
- 初始爲升序排序 list.sort()
sort()與sorted()的區別
- 就是sorted() 函數也不會改變所傳入的可迭代對象,該函數只是返回一個新的、排序好的列表。
>>> x =[4, 6, 2, 1, 7, 9]
>>> y = sorted(x)
>>> print (y)
[1, 2, 4, 6, 7, 9]
>>> print (x )
[4, 6, 2, 1, 7, 9]
- sorted() 函數時,傳入一個 reverse 參數,如果將該參數設置爲 True,則表示反向排序
>>> sorted(a, reverse = True)
[90, 30, 20, 3.6, 3.5, -1.2]
- 調用 sorted() 函數時,還可傳入一個 key 參數,該參數可指定一個函數來生成排序的關鍵值
>>> b = ['fkit', 'crazyit', 'charlie', 'fox', 'Emily']
>>> sorted(b, key = len)
['fox', 'fkit', 'Emily', 'crazyit', 'charlie']