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

  • 23
  • 0
  • 约1.03万字
  • 约 28页
  • 2017-05-06 发布于贵州
  • 举报

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

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)

1亿VIP精品文档

相关文档