NOI2002普及组解题报告【信息技术】.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文档。上传文档
查看更多
2002年全国青少年信息学(计算机) 奥林匹克分区联赛复赛提高组试题解题报告 题一 均分纸牌(存盘名 NOIPG1) [问题描述]   有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。   移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。   现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。   例如 N=4,4 堆纸牌数分别为:   ① 9 ② 8 ③ 17 ④ 6   移动3次可达到目的:   从 ③ 取 4 张牌放到 ④ (9 8 13 10) - 从 ③ 取 3 张牌放到 ②(9 11 10 10)- 从 ② 取 1 张牌放到①(10 10 10 10)。 [输 入]:   键盘输入文件名。文件格式:   N(N 堆纸牌,1 = N = 100)   A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l= Ai =10000) [输 出]:   输出至屏幕。格式为:   所有堆均达到相等时的最少移动次数。 [输入输出样例]   a.in:    4    9 8 17 6 屏慕显示:    3 分析:   如果你想到把每堆牌的张数减去平均张数,题目就变成移动正数,加到负数中,使大家都变成0,那就意味着成功了一半!拿例题来说,平均张数为10,原张数9,8,17,6,变为-1,-2,7,-4,其中没有为0的数,我们从左边出发:要使第1堆的牌数-1变为0,只须将-1张牌移到它的右边(第2堆)-2中;结果是-1变为0,-2变为-3,各堆牌张数变为0,-3,7,-4;同理:要使第2堆变为0,只需将-3移到它的右边(第3堆)中去,各堆牌张数变为0,0,4,-4;要使第3堆变为0,只需将第3堆中的4移到它的右边(第4堆)中去,结果为0,0,0,0,完成任务。每移动1次牌,步数加1。也许你要问,负数张牌怎么移,不违反题意吗?其实从第i堆移动-m张牌到第i+1堆,等价于从第i+1堆移动m张牌到第i堆,步数是一样的。   如果张数中本来就有为0的,怎么办呢?如0,-1,-5,6,还是从左算起(从右算起也完全一样),第1堆是0,无需移牌,余下与上相同;再比如-1,-2,3,10,-4,-6,从左算起,第1次移动的结果为0,-3,3,10,-4,-6;第2次移动的结果为0,0,0,10,-4,-6,现在第3堆已经变为0了,可节省1步,余下继续。 程序清单   program NOIPG1;    const maxn=100;    var i,j,n,step:integer;ave:longint;     a:array[1..maxn]of integer;     f:text;filename:string;    begin     write(Input filename:);readln(filename);     assign(f,filename);reset(f);     readln(f,n);ave:=0;step:=0;     for i:=1 to n do begin      read(f,a[i]); inc(ave,a[i]);     end;     ave:=ave div i;     for i:=1 to n do a[i]:=a[i]-ave;     i:=1;j:=n;     while a[i]=0 do inc(i);{过滤左边的0}     while a[j]=0 do dec(j);{过滤右边的0}     while (ij) do begin      inc(a[i+1],a[i]);{将第i堆牌移到第i+1堆中去}      a[i]:=0;{第i堆牌移走后变为0}      inc(step);{移牌步数计数}      inc(i);{对下一堆牌进行循环操作}      while a[i]=0 do inc(i);{过滤移牌过程中产生的0}     end;     writeln(step);    end.   点评:   基本题(较易) 本题有3点比较关键:一是善于将每堆牌数减去平均数,简化了问题;二是要过滤掉0(不是所有的0,如-2,3,0,-1中的0是不能过滤的);三是负数张牌也可以移动,这是辩证法(关键中的关键)。 字串变换 (存盘名: NOIPG2) [问题描述]: A$, B$ 及一组字串变换的规则(至多6个规则): A1$ - B1$      A2$ - B2$   规则的含义为:在 A$中的子串 A1

文档评论(0)

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

1亿VIP精品文档

相关文档