最小函数值问题解决.docVIP

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

【题目描述】 有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。输入数据保证0Ai=10,0Bi=100,0Ci=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 (son1)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 (son1)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+1lmin)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(j0lmax)and(maxh[j0]maxh[j0+1]) then j0:=j0+1;

文档评论(0)

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

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

版权声明书
用户编号:5212202040000002

1亿VIP精品文档

相关文档