貪心問題(Python代碼實現)——磁帶最優存儲問題


今早任務——貪心算法,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. 計算每個程序的長度和讀取概率的乘積。
  2. 對1.產生的結果進行排序。
  3. 當訪問次序確定時,求出每個程序的訪問時間。
  4. 求出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的知識

列表

  1. 清空是 t=[0]*n
  2. for i in range(1,n):# 從1開始,到n-1 左閉右開
  3. a[i],b[i]=map(int,input().split(’ '))//列表輸入 兩個列表一起 就是 2 4 這個格式的輸入
  4. a=a = list(map(int, input().split(’ '))) # 單個列表的輸入
關於Python sort
  1. list .sort(reverse=True) 降序 排序
  2. 初始爲升序排序 list.sort()
sort()與sorted()的區別
  1. 就是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] 
  1. sorted() 函數時,傳入一個 reverse 參數,如果將該參數設置爲 True,則表示反向排序
>>> sorted(a, reverse = True)
[90, 30, 20, 3.6, 3.5, -1.2]

  1. 調用 sorted() 函數時,還可傳入一個 key 參數,該參數可指定一個函數來生成排序的關鍵值
>>> b = ['fkit', 'crazyit', 'charlie', 'fox', 'Emily']
>>> sorted(b, key = len)
['fox', 'fkit', 'Emily', 'crazyit', 'charlie']

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章