2011年北京市海淀区信息学竞赛中学组解题报告.doc

2011年北京市海淀区信息学竞赛中学组解题报告.doc

  1. 1、本文档共28页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2011年北京市海淀区信息学竞赛中学组解题报告

2011年北京市海淀区信息学竞赛中学组解题报告 NB2011初中组解题报告 NB2011初中组 T1 斯诺克 snooker 此题是模拟,基本按题目说的写就好。 需要注意的几点是: 1.打错的球不影响任何状态改变 2.打完15个红球之后特判 3.给对手加分时判断球分是否小于4 4.注意两人切换时除了击球次数重新算 其他状态均不变 代码: /gmtWn var i,rnum,q:longint; n,s:array[1..2] of longint; procedure deal(x:longint); var i,a:longint; begin for i:=1 to n[x] do begin read(a); if a=0 then inc(s[3-x],4) else if rnum15 then begin if odd(i) then begin if a1 then begin if a4 then inc(s[3-x],4) else inc(s[3-x],a); end else begin inc(s[x],1); inc(rnum); end; end else begin if a=1 then inc(s[3-x],4) else inc(s[x],a); end; end else begin if q=-1 then begin inc(s[x],a); q:=1; end else begin if a=q+1 then begin inc(s[x],a); q:=a; end else if a4 then inc(s[3-x],4) else inc(s[3-x],a); end; end; end; end; begin assign(input,#39;snooker.in#39;);reset(input); assign(output,#39;snooker.out#39;);rewrite(output); read(n[1],n[2]); s[1]:=0;s[2]:=0; rnum:=0;q:=-1; deal(1);deal(2); writeln(s[1],#39; #39;,s[2]); close(input);close(output); end. 题解: 此题显然是排序+统计 首先观察“牛人”的定义:对于人A,如果其它n-1个人中,没有人的智力值和能力值都比A高,则我们称A为“牛人”。 我们很容易得到一个等价的定义是:对于人A,在如果智力值比A高的人中没有一个体力值比A高,那么A为“牛人”。 于是我们得到如下一个算法: 首先对所有人的智力值排序 然后按智力值从大到小考虑每个人 将他的体力值(记为t)与已考虑过的人(即智力值大于此人的人)的体力值的最大值(记为max)比较,若t=max 那么说明这个人是“牛人” 否则这个人不是。 不难发现这个处理过程是O(n)的 加上排序的复杂度O(n log n) 所以整个算法的时间复杂度是O(n log n) 有个细节要注意 就是智力值相同的情况下的判断。一种方法是每次考虑所有智力值一样的一组人 不过这样实现起来比较麻烦。另一种方法是对于数据按需要进行双关键字排序(第一关键字从小到大 第二关键字从大到小 然后从n向1统计),然后直接统计。 Code: /rlri0 var a:array[1..100000,1..2] of int64; i,n,ans:longint; max:int64; procedure fs(s,e:longint); var m,k,j:longint; ms:array[1..2] of int64; begin m:=(s+e) shr 1;k:=s;j:=e; ms:=a[m];a[m]:=a[k]; while kj do begin while (kj)and((a[j,1]ms[1])or((a[j,1]=ms[1])and(a[j,2]ms[2]))) do dec(j); if kj then begin a[k]:=a[j];inc(k);end; while (kj)and((a[k,1]ms[1])or((a[k,1]=ms[1])and(a[k,2]ms[2]))) do inc(k); if kj then begin a[j]:=a[k];dec(j);end; end; a[k]:=ms; if sk-1 then fs(s,k-1); if j+1e then fs(j+1,e); end; begin assign(input,#39;niuren.in#39;);reset(input); assign(output,#39;niuren.out#39;);rewr

您可能关注的文档

文档评论(0)

1045141460 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档