NOIP2005提高组解题报告3【信息技术】.docVIP

NOIP2005提高组解题报告3【信息技术】.doc

  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文档。上传文档
查看更多
NOIP2005提高组解题报告 第一题:scholar 题意分析 给出N(1≤N≤100)个人的情况,按照5条不同的奖学金条件发奖金(可重复得奖),求得到最多奖学金的人是谁,并求总奖学金数。 算法分析 这是一道简单题,没有什么更好或更坏的算法。只需按照实际情况模拟即可,每人判断5个条件,该发多少发多少就行了。要注意的是每人最多得15850元,总数最多1585000元,注意长整的使用。 参考程序 #include stdio.h #define MAXN 100 /*最大人数*/ FILE *fpi,*fpo; char name[MAXN+1][21]; /*人名*/ int n; int main(){ long s=0,max=0,maxi, money; int i,mark,clmark,paper; char g,w; fpi=fopen(scholar.in,r); fpo=fopen(scholar.out,w); fscanf(fpi,%d,n); for(i=1;i=n;i++){ money=0; fscanf(fpi,%s %d %d %c %c %d,name[i],mark,clmark,g,w,paper); if(mark80 paper0) money+=8000; /*判断各个奖*/ if(mark85 clmark80) money+=4000; if(mark90) money+=2000; if(mark85 w==Y) money+=1000; if(clmark80 g==Y) money+=850; s+=money; if(moneymax){ max=money; maxi=i; } } fprintf(fpo,%s\n%ld\n%ld\n,name[maxi],max,s); fclose(fpi); fclose(fpo); return(0); } 第二题:river 题意分析 一个青蛙要过一个宽为P米(1≤P≤10^9)的河,他一步能跳S到T米(1≤S≤T≤10),他不喜欢踩到河里的石子(石子数M≤100),给出每个石子的坐标,问最少踩到多少石子能过河。 算法分析 这道题在没看数据规模之前以为是一道简单的DP,但是数据开到十亿,无论在时间还是空间复杂度都过大,所以就要进行优化了。 解一: 简单方法:预期得分30。简单动态规划,f[i]代表青蛙跳到i点时所可能踩到的最少石子数,所以有f[i]=min{f[k]+map[i]}(i-s≤k≤i-t),其中map[i]代表i上是否有石子,有是1,否则0。算法复杂度O(n^2)。 解二: 改进方法:预期得分100。我们会发现,虽然桥很长,但上面最多只有100个石子,想到能否用石子DP,而应该是不行的。那能否基于第一种方法?由于石子排布非常的疏,我们还会发现,如果两个石子相隔甚远,那他们中间的f[i]大部分将会是同一个数,能否把两个石子的距离缩短,使之还与原来等效?要是行的话怎么缩?王乃岩同学考试时做了一个方法能够过全部数据,用的滚动数组存储,下面列出了他的程序。我自己也写了个程序,和他不尽相同:我令L=stone[i]-stone[i-1](stone[i]代表按坐标由小到大顺序排列的石块坐标),当L能够被t整除时(L%t==0),令k=t;当L不能被t整除时(L%t!=0),令k=L%t。然后令k为k+t,最后判断如果kL,那么map[]数组中stone[i]和stone[i-1]两石头的距离就被等效成为L(也就是没变);如果k=L,那么map[]数组中stone[i]和stone[i-1]两石头的距离就被等效成为k,可以看出来,这样处理完,两石子最大间距为2*t,大大的缩短了数组,再按解一进行DP,就可以通过了。 参考程序 王乃岩: Program River; Var f1, f2 : Text; x, Temp, i, l, s, t, p, q, n : Longint; Stone : Array[1..100] Of Longint; a : Array[0..9] Of Integer; Procedure Qsort(l, r : Longint); Var i, j, x, Temp : Longint; Begin i := l; j := r; x := Stone[(l + r) Shr 1]; Repeat While Stone[i] x Do In

文档评论(0)

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

1亿VIP精品文档

相关文档