python最优调配问题_用Python代码实现贪心问题:最优合并问题、程序存储问题、最优服务次序问题...

最优合并问题:

给定k个排好序的序列s1,s2,…,sk,用2路合并算法将这k个序列合并成一个序列。假设所采用的2路合并算法合并两个长度分别为m和n的序列需要m+n-1次比较。试设计一个算法确定合并这个序列的最优合并顺序,使所需要的总比较次数最少。

贪心策略:

每次选最小的序列合并得到最少比较次数;

2 个长度分别为m和n的序列需要m + n -1次比较

问题模型:

贪心策略写即可

排好序从小到大

2 个长度分别为m和n的序列需要m + n -1次比较

n = int(input())

a = list(map(int, input().split(' ')))

w=int(0)

i=int(0)

a.sort()#从小到大排序

while(i

w=w+a[i]+a[i+1]-1;#2个长度分别为m和n的序列需要m+n -1次比较

a[i]=a[i]+a[i+1];

a[i+1]=0

i+=1

a.sort()

print(w)

# print(b)

测试数据

5

11 10 4 5 6

测试结果

77

程序存储问题:

设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是li1≤i≤n。程序存储问题要求确定这n 个程序在磁带上的一个存储方案,使得能够在磁带上存储尽可能多的程序。对于给定的n个程序存放在磁带上的长度,编程计算磁带上最多可以存储的程序数

贪心策略:从程序长度小开始存储到磁带上

问题:

从小到大排序

每次放入时判断是否超过磁带长度,是则退,否则继续放入

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 main():

# if __name__=="__main__":

n,m = map(int, input().split(' '))

a = list(map(int, input().split(' ')))

Sort(a)

sum=int(0)

i=int(0)

cnt=int(0)

for i in range(n):#

if(sum<=m):#如果磁带还可以存储程序

sum+=a[i]

cnt+=1

elif(sum>m):#不可以 则退回加多的 #否则就刚刚好

sum-=a[i]

cnt-=1#退回一个

break#介绍

print(cnt)

输入

n,m n是程序个数 m磁带长度

列表 a

# 5 10

# 2 5 4 6 2 列表

# 3 结果

最优服务次序问题:

设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti,1≤i≤n。共有s处可以提供此服务。应如何安排n个顾客的服务次序才能使平均等待时间达到最小平均等待时间是n个顾客等待服务时间的总和除以n。郑州人流手术多少钱 http://mobile.chnk120.com/

贪心策略:

服务时间越短越好

问题建模:

1.顾客的等待时间n个顾客

2.s个服务取n个顾客做药服务的时间,求平均等待是时间达到最小

3.服务时间从小到大排序

4.达到s个服务出的等待时间

5.求出平均等待时间

Python代码:

# def main():

# if __name__=="__main__":

n,s= map(int,input().split(' '))

a = list(map(int, input().split(' ')))

b=[0]*(n+1)# 服务窗口顾客等待时间

sum=[0]*n# 服务窗口顾客等待时间时间之和

w=int(0)

i=int(0)

j=int(0)

a.sort()

# print(b)

b[0]=1

while(i

if(b[0]==1):

b[j]+=a[i]

else:

b[j]+=a[i]

# print(b[j])

# print(a[i])

sum[j]+=b[j]

i+=1;

j+=1;

if(j==s):#s个服务

j=0

t=float(0)

for i in range(n):

t+=sum[i]

t/=n #平均等待时间

print(t)

测试数据

10 2

2 5 10 45 26 30 108 8 9 12

测试结果

43.9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值