- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
NOIP 2005 解题报告 1.谁拿了最多奖学金(scholar) 我承认今年的题是历届最难的一次,除了这道。 对输入信息进行整理,判断奖金,比较最大值,加和,最后输出就行了。没什么好说的。 Program ?scholar; var n,i,s1,s2,s3:byte; name,re:string[20]; ch,b1,b2,bk:char; s,ms,sum:dword; begin assign(input,scholar.in); assign(output,scholar.out); reset(input); rewrite(output); readln(n); sum:=0; ms:=0; for i:=1 to n do begin name:=; read(ch); while ch do begin name:=name+ch; read(ch); end; readln(s1,s2,bk,b1,bk,b2,s3); s:=0; if (s1 80) and (s3 0) then inc(s,8000); if (s1 85) and (s2 80) then inc(s,4000); if (s1 90) then inc(s,2000); if (s1 85) and (b2=Y) then inc(s,1000); if (s2 80) and (b1=Y) then inc(s,850); if s ms then begin ms:=s; re:=name; end; inc(sum,s); end; writeln(re); writeln(ms); writeln(sum); close(input); close(output); end. 2.过河(river) 动态规划 这道题的方程很好想,设dp[i]表示到i点最少碰到的石子数 dp[i]=dp[i-k]+s[i](s =k =t),i处是石头则s[i]=1,否则=0。 但题目的规模是10^9,我们要解决两个问题,一是空间问题,二是时间问题。 空间问题:我们发现k的值最大只有10,所以可以用滚动数组,问题解决。 时间问题:朴素的做法是O(lt)的肯定要超时,但我们发现l最大10^9,m最大只有100,也就是说,在大多数情况下,两个石子的距离是相当大的,而动态规划却在这个相当大的距离上耗费太多的时间,算法的瓶颈就在这里。 不知道大家有没有看过星战,两个距离非常大的地方可以通过超时空来瞬间到达,这是个很好的思路。 顺着这个思路,我们设想一下,在这个距离内没有石子,意味着dp不会增加,只能不断调用之前的值。这时如果走了一圈发现没有任何变化,那么再走一圈呢?肯定依然没有变化,所以这时就可以“超时空”到下一个石头附近。 我们设rn记录重复次数,如果这个次数 =t,就是循环了一圈,这时直接到下一个石头附近,算法的复杂度是O(mt),问题解决。 progaram river; ?var l,swap,u:dword; v:longint; s,t,m,i,j,sn,re,p,rn:byte; stone:array[1..101]of dword; dp:array[0..9]of byte; // function min (a,b:byte):byte; begin if a b then exit(b) else exit(a); end; // begin assign(input,river.in); assign(output,river.out); reset(input); rewrite(output); readln(l); readln(s,t,m); for i:=1 to m do read(stone[i]); readln; for i:=1 to m-1 do for j:=i+1 to m do if stone[i] stone[j] then begin swap:=stone[i]; stone[i]:=stone[j]; stone[j]:=swap; end; stone[m+1]:=l; fi
文档评论(0)