回 帖 发 新 帖 刷新版面

主题:一道“程序最优存储问题”,谁能帮忙啊?~~

哪位能帮小女子搞定这题目啊?实在是不会做呀~~要用C++写呢

题目是:程序最优存储问题
«问题描述:
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是l(1),l(2),l(3)...l(n)  这n 个程序的读取概率分别是p(1),p(2),p(3)...p(n) 且它们相加,和为1。如果将这n 个程序按i(1),i(2),i(3)...i(n) 的次序存放,则读取程序i(r) 所需的时间t(r)=p(i1)l(i1)+p(i2)l(i2)+...p(ir)l(ir) 这n 个程序的平均读取 时间为t(1)+t(2)+...+t(r)
   磁带最优存储问题要求确定这n 个程序在磁带上的一个存储次序,使平均读取时间达到最小。试设计一个解此问题的算法
«编程任务:
对于给定的n个程序存放在磁带上的长度和读取概率,编程计算n个程序的最优存储方
案。
«数据输入:
由文件input.txt给出输入数据。第一行是正整数n,表示文件个数。接下来的n行中,
每行有2 个正整数a 和b,分别表示程序存放在磁带上的长度和读取概率。实际上第k个程序的读取概率a(k)/a(1)+a(2)+...+a(n)
«结果输出:
将编程计算出的最小平均读取时间输出到文件output.txt。
输入文件示例 输出文件示例
input.txt         output.txt
5                 85.6193
71 872
46 452
9 265
73 120
35 85[em10][em10]

回复列表 (共10个回复)

沙发

我倒有一个不是太妙的方法,你可以这样编写
首先定义一个结构体变量
struct Value{
      int p;//该程序的访问频度
      int l;//该程序占用的长度
};
struct Value Program[n];//定义一个数组,如果是从文件读取的话,须动态分配内存
然后就是对该数组的下标1,2,...n进行排序,每获的一个排序,就
使用t(r)=p(i1)l(i1)+p(i2)l(i2)+...p(ir)l(ir)与t(1)+t(2)+...+t(r),求出这个排列的平均读取时间,每个排列得到一个值,得到n个值,求这n个值的最小值,得到的最小值对应的排列即为所要的排列
如果要代码的话,你等我有时间我会发上去的

板凳

我又找到一个方法
你可以这样,设平均存储时间为PT=n*p(i1)l(i1)+(n-1)*p(i2)l(i2)+...(n-r+1)*p(ir)l(ir)+...p(in)l(in)
若PT最小,又因为p(i)l(i)(i=1,...n)为正数,所以最小值序列为p(i)l(i)(i=1,...n)
从大到小排列即可。其实这是一个排序问题
从大到小的序列即是最优的存储顺序

3 楼

错了!!!!
我又找到一个方法
你可以这样,设平均存储时间为PT=n*p(i1)l(i1)+(n-1)*p(i2)l(i2)+...(n-r+1)*p(ir)l(ir)+...p(in)l(in)
若PT最小,又因为p(i)l(i)(i=1,...n)为正数,所以最小值序列为p(i)l(i)(i=1,...n)
从小到大排列即可。其实这是一个排序问题
从小到大的序列即是最优的存储顺序

4 楼


你好啊 我看到网上你的帖子 会  磁带最优存储问题  可以帮我写下代码吗?
我现在很需要.尽快好吗?我的QQ号是39666866

5 楼

懒惰学生作业帖或变相作业帖一些共同特徵:
1。原封不动复制老师作业题
2。没有自己的思考
3。没有具体到点子上的问题,象我什么地方不懂
4。没有自己的解决方案和那里遇到了困难
5。要求源代码
6。紧急无比,但过期作废。你回答他(她)也不理你了
7。典型老师作业题目,多数见过。但是懒惰学生连搜索都懒得做

8。加上一些花样,企图冒充项目问题。虽然懒惰,还是比较好一些。因为至少转了两下脑筋 

http://bbs.chinajavaworld.com/thread.jspa?threadID=726764&tstart=0

6 楼

呵呵 不知道我是不是楼上所说的懒学生~因为我也是来这里找作业答案的~

TO:三楼

我又找到一个方法
你可以这样,设平均存储时间为PT=n*p(i1)l(i1)+(n-1)*p(i2)l(i2)+...(n-r+1)*p(ir)l(ir)+...p(in)l(in)
若PT最小,又因为p(i)l(i)(i=1,...n)为正数,所以最小值序列为p(i)l(i)(i=1,...n)
从小到大排列即可。其实这是一个排序问题
从小到大的序列即是最优的存储顺序

可以用贪心来求这个吧?每次选择p(ik)*l(ik)最小的数来作为当前的选择吗?




还有一个题目类似:最优服务次序问题

问题描述:
设有n 个顾客同时等待一项服务。顾客i需要的服务时间为t(i),i=1,…,n 。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n 个顾客等待服务时间的总和除以n。

编程任务:

对于给定的n个顾客需要的服务时间,编程计算最优服务次序。

数据输入:

由文件input.txt给出输入数据。第一行是正整数n,表示有n 个顾客。接下来的1 行中,有n个正整数,表示n个顾客需要的服务时间。


结果输出:

将编程计算出的最小平均等待时间输出到文件output.txt。


输入文件示例 


input.txt


10


56 12 1 99 1000 234 33 55 99 812


输出文件示例


output.txt 


532.00



我觉得也是个排序问题,将每个顾客需要的服务时间从小到大的排列不是就可以了吗?然后求他们的平均等待时间。但是如果按照这样的方法,我用计算器算了下,题目给的示例文件的答案是200多,比给出的输出示例的值还要优……

请教一下各位了~

7 楼

To silly_sinba:

I don't think you are 楼上所说的懒学生, since you are using your brain, and asking specific questions.

I think you are correct, unless the question has some unknown conditions.

Thanks!

8 楼


谢谢~呵呵

其实我最先想做的题目是最优服务问题,但是用贪心计算出来的最优值和示例中给的不符合,所以换了题目——磁带最优存储问题。

不过我的贪心的算法设计刚完成了,最后还是做的最优服务次序问题,我把我的结果不符和写在报告里面了。

等我们的最后交作业时间过了我会把这个问题拿出来大家一起看看,但是现在如果贴出贪心的证明或者代码,我相信我的同学一定有能力搜到这里的~呵呵。

我坚决支持你主张不帮人做作业。
但是对求作业的同学,其实我还是有些明白的,一些纯粹要分析和代码,然后COPY给老师看。
一些,成绩不好但是想自己做的,只求找点思路,然后自己写代码。
但是问作业的同学不论哪种可能都会比较急,论坛里面愿意帮忙的人不一定分的清楚哪些是求思想,哪些是求代码的。

我觉得如果有时间,可以说一两句题的解法,让问问题的人自己去想,如果他不去思考,也留个东西让后来的同学可以GOOGLE到,其实也挺好的~对吧[em2]

9 楼

[quote]但是对求作业的同学,其实我还是有些明白的,一些纯粹要分析和代码,然后COPY给老师看。
一些,成绩不好但是想自己做的,只求找点思路,然后自己写代码。
但是问作业的同学不论哪种可能都会比较急,论坛里面愿意帮忙的人不一定分的清楚哪些是求思想,哪些是求代码的。
[/quote]

Actually, it is very easy to tell the difference. 

When I suspect, but not sure, I would give 思路, most of the chances, they were not interested at all!!!

10 楼

你留下的解法,提问的人也许完全没兴趣,但是后来的同学搜到了拿来学习,其实你也帮了很多人的忙,即使楼主完全不会在回来了,你也没有白劳动的~
[em11]

我来回复

您尚未登录,请登录后再回复。点此登录或注册