最小函数值问题解决(精选).docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
最小函数值问题解决(精选)

【题目描述】 有n个函数,分别为F1,F2,...,Fn。定义Fi x Ai*x^2+Bi*x+Ci xN* 。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个 【格式神马的】 输入数据 第一行输入两个正整数n n 10000 和m m 10000 。 以下n行每行三个正整数,其中第i行的三个数分别位Ai、Bi和Ci。输入数据保证0 Ai 10,0 Bi 100,0 Ci 10 000。 输出数据 输出将这n个函数所有可以生成的函数值排序后的前m个元素。 这m个数应该输出到一行,用空格隔开。 样例输入 3 10 4 5 3 3 4 5 1 7 1 样例输出 9 12 12 19 25 29 31 44 45 54 【规模】 20%的数据n 100 100%的数据n 10000 90%的数据9000 m 10000 【分析】利用堆结构,建大根堆,再用堆排序。建大根堆的过程中用到小根堆来取fi[x]中最小的数。堆满后,还要进行若干取最小数的过程,直到新的最小数比大根堆中根要大。若要输出前12个数,应为9 12 12 19 25 29 31 44 45 54 61 69。 program p3; ?var minh,maxh:array[1..10000]of longint; a,b,c:array[1..10000]of integer; te,n,m,i,j,lmin,lmax,x:longint; ?function f i,x:integer :longint; ?begin f: a[i]*x*x+b[i]*x+c[i]; ?end; ?procedure putmin y:longint ;//建立小根堆 ?var te:longint;son:integer; ?begin lmin: lmin+1; minh[lmin]: y; son: lmin; while son 1 and minh[son div 2] minh[son] do begin te: minh[son]; minh[son]: minh[son div 2]; minh[son div 2]: te; son: son div 2; end; ?end; ?procedure putmax y:longint ;//建立大根堆 ?var te:longint;son:integer; ?begin lmax: lmax+1; maxh[lmax]: y; son: lmax; while son 1 and maxh[son div 2] maxh[son] do begin te: maxh[son]; maxh[son]: maxh[son div 2]; maxh[son div 2]: te; son: son div 2; end; ?end; ?function getmin :longint;//取小根堆中根结点 ?var fa,son:integer;te:longint; ?begin getmin: minh[1]; minh[1]: minh[lmin]; lmin: lmin-1; fa: 1; while fa*2 lmin or fa*2+1 lmin do ??begin if fa*2+1 lmin or minh[fa*2] minh[fa*2+1] then son: fa*2 else son: fa*2+1; if minh[fa] minh[son] then begin te: minh[fa]; minh[fa]: minh[son]; minh[son]: te; fa: son; end else break; end; ?end; ?procedure tiao i:longint ;//调整大根堆 ?var i0,y0,j0:longint; ?begin i0: i; y0: maxh[i]; j0: 2*i0; while j0 lmax do begin if j0 lmax and maxh[j0] maxh[j0+1] then j0: j0+1; if y0 maxh[j0]then begin maxh[i0]: maxh[j0];i0: j0;j0: 2*i0 end else j0: lmax+1; end; maxh[i0]: y0; ?end; ?begin readln n,m ; for i: 1 to n do?? readln a[i],b[i],c[i] ; lmax: 0;lmin: 0;x: 1; for i: 1 to n do putmin f i,x ;//对于

文档评论(0)

dashewan + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档