第一届浙江师范大学C语言程序设计竞赛解题报告

  • 格式:pdf
  • 大小:559.32 KB
  • 文档页数:17

下载文档原格式

  / 17
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Input
第一行一个整数 case,表示下面有 case 组数据。每组数据两行,第一行一个数 N ( 3 < N < 10005 ),表示有 N 个评分。接下来一行有 N 个实数,表示得分.
Output
每一行对应一组答案即平均得分(保留小数点后 2 位)。
Sample Input
1 5 1.1 1.9 3.1 4.0 5.1
c=0; n=2*n-1; while(n--){ scanf("%d",&d); c^=d; } printf("%d\n",c); }
D:逃税的惩罚 II
Time Limit: 1000MS Memory Limit: 22 Accepted: 1 65536K Total Submissions:
为止都没有取得胜利; 输入数据之间用空行隔开(不需要考虑)。
Output
如果下一步是 Alice 走并且能取得胜利,输出“Case x:Alice win!”,下一步是 Bob 走并且能取得胜利,输出“Case x:Bob win!”,其余情况输出“Case x:Tie”,x 表示 第 x 组数据。
Input
集训队里一共有 N 人(N<=1,000,000),任意两位队员可能有相同的编号 no(0<=no<=1,000,000,000),他们所交的奖牌就以上交队员的编号作为区分,共 有 2*N-2 块奖牌编号作为输入,每个测试文件只有一组数据。
Output
两个漏缴保护费的队员的编号, 从小到大输出,数据保证两位漏缴队员没有相同 编号。
Sample Input
5 13501537
Sample Output
07 思路: 在上一题的基础上,假设 a 和 b 是我们要找的两个数,然后 c=a ^ b,这样,c! =0,所以 c 化成二进制数时,必然某位上是 1。 那么任意取 c 为 1 的那位数,与其他所有的数去 & 一下,就可以分成两类,同 时,a,b 保证分别在这两类中,对于每一类,就跟上一题一样的做法了,这样的 复杂度为 O(n),此题数据较多,所以一般的 O(nlogn)方法可能会超时 参考代码: #include<stdio.h> #include<string.h> int a[2000005]; int p[50]; int main(){ int i,n; p[0]=0; p[1]=1; for(i=2; i<32; i++){ p[i]=p[i-1]*2; } while(scanf("%d",&n) != EOF ){ int x=0; n=n*2-2; for(i=0; i<n; i++){ scanf("%d",&a[i]); x=x^a[i]; } int k; for(i=1; i<32; i++){ if((p[i]&x)==p[i]) { k=i; break; } } int r1=0,r2=0; for(i=0; i<n; i++){ if((p[k]&a[i])==p[k]) r1=r1^a[i]; else r2=r2^a[i]; } if(r1>r2) {
C:逃税的惩罚 I
Time Limit: 1000MS Memory Limit: 88 Accepted: 15 65536K Total Submissions:
Description
现在是每年集训队收保护费的时间。 每个集训队队员每年这个时候需要交纳两块奖牌给韩 BOSS,其他多余奖牌留给 自己做纪念,但有一个队员只交了一块奖牌,琪琪受命于韩 BOSS,要揪出这一 个队员。 琪琪想起了霍格沃兹战斗分队的队长在第一节学员培训课上就讲述过“百万军中 揪逃税者如探囊取物”的知识,但是琪琪打瞌睡没有认真听。现在,她非常需要 你的帮忙! 【位运算小知识】 与 & 或 | 非 ! 异或 ^ 左移 <<
题目讲解
A:欢乐五子棋
Time Limit: 1000MS Memory Limit: 8 Accepted: 3 65536K Total Submissions:
Description
五子棋是一种两人对弈的纯策略型棋类游戏, 是起源于中国古代的传统黑白棋种 之一。发展于日本,流行于欧美。容易上手,老少皆宜,而且趣味横生,引人入 胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。 传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为 19× 19,棋子放置于 棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的 5 个或 5 个以上同色棋子连成不间断的一排者为胜。 Alice 和 Bob 的五子棋游戏和传统的五子棋有一些不一样就是他们使用的棋盘被 更改成为 9× 9。由于 Alice 是女生,所以每局比赛都由 Alice 执黑先走。 现在给定一个 9× 9 的棋盘,问下一步走的那个人是否能获胜,你能编程告诉我 吗?
Output
漏缴保护费的队员的编号。
Sample Input
5 135015355
Sample Output
0
Hint
两个编号为 5 的队员都交了两块奖牌,而编号为 0 的队员只交了一块。 思路: 题目意思有点拗口,但意思其实很简单,给你 2*n-1 个数,让你找出哪个数只出 现了奇数次,这个利用位运算就很简单了,用异或操作 (^),相同的数异或则为 0,0 异或任何数都是任何数,所以,初始一个 0,然后去异或所有的数,则这个 结果就是答案。 参考代码: #include<stdio.h> int main(){ int n,c,d; scanf("%d",&n);
Sample Output
3.00 思路: 此题比较简单,线性的扫描每个数,然后记录最大值,和最小值,同时把每个数 之和加起来,那么最后的结果就是(总和-最大值-最小值)/(个数-2)
参考代码: #include<stdio.h> int main(){ int cas,n,i; double x,s,m1,m2; scanf("%d",&cas); while(cas--) { s=0; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%lf",&x); s+=x; if(i==1)m1=x,m2=x; else { if(m1>x)m1=x; if(m2<x)m2=x; } } printf("%.2lf\n",(s-m1-m2)/(n-2)); } }
Description
又到了每年集训队收保护费的时间了。 每个集训队队员每年这个时候需要交纳两块奖牌给韩 BOSS,其他多余奖牌留给 自己做纪念,但和去年不一样,这次有两个队员只交了一块奖牌,琪琪受命于韩 BOSS,要揪出这两个队员。 琪琪想起了霍格沃兹战斗分队的队长在第一节学员培训课上就讲述过“百万军中 揪逃税者如探囊取物”的知识,但是琪琪打瞌睡没有认真听。现在,她非常需要 你的帮忙!
Sample Input
2 b........ ...b.w..b .w.w..... wbw....bw b........ ..bbb..b. w.wb....w bbbw....w ww..wb.wb b..w..... ...b.w..b .w.w..... wbw....bw b........ ..bbb.b.. w.wb....w bbbw....w ww..wb.wb
Input
数据的第一行是一个整数 N(N<50),表示一共有 N 组数据; 接着是 N 组测试测试数据; 每组测试数据包括 9 行 9 列的字符; 这 9 行测试数据中的字符只包括‘b’、‘w’、‘.’,分别代表黑子,白子和空的; 输入数据都是合法数据, 就是说(黑子数-白子数)=0 或 1, 以及任何一方到当前步
Sample Output
Case 1:Tie Case 2:Alice win! 思路: 其实本题并不难,类型为模拟题。 读入 9*9 的字符矩阵后,可以先统计下黑子和白字的数量,如题目中描写,黑子
多则该白字下了,数量一样则该黑子下了。 对于下哪步,可以枚举空白部分的各种情况,把相应的棋子放进去,判断下,横 线、竖线或斜线有没有连成 5 颗的情况,有的话,就有胜负,各种情况都没有的 话,就是平局。 参考代码: #include<stdio.h> char g[15][15]; int dx[]={-1,-1,-1,0,1,1,1,0}; int dy[]={-1,0,1,1,1,0,-1,-1}; bool chk(int x,int y,int t){ int i,tx,ty,ct[8]; char p=t?'w':'b'; for(i=0;i<8;i++){ ct[i]=0; tx=x+dx[i], ty=y+dy[i]; while(tx>=0&&tx<9&&ty>=0&&ty<9&&g[tx][ty]==p){ ct[i]++; tx=tx+dx[i], ty=ty+dy[i]; } } for(i=0;i<4;i++) if(ct[i]+ct[i+4]>=4) { printf("%s\n",t?"Bob win!":"Alice win!"); return 1; } return 0; } int main(){ int i,j,r=1,Cas,cb,cw,tie; scanf("%d",&Cas); while(Cas--){ for(i=0;i<9;i++) scanf("%s",g[i]); printf("Case %d:",r++); cb=cw=0; for(i=0;i<9;i++){ for(j=0;j<9;j++){ if(g[i][j]=='b') cb++; if(g[i][j]=='w') cw++; } }tie=1; for(i=0;i<9&&tie;i++){ for(j=0;j<9&&tie;j++){ if(g[i][j]=='.'&&chk(i,j,cb-cw)) { tie=0; break;
int tmp=r1; r1=r2; r2=tmp; } printf("%d %d\n",r1,r2); } }
E:码头
Time Limit: 1000MS Memory Limit: 107 Accepted: 25 65536K Total Submissions:
Description
甲乙两艘轮船驶向一个不能同时停泊两艘轮船的码头, 它们在一昼夜内到达的时 间是等可能的。如果甲船的停泊时间是 x(0<=x<=24)小时,乙船的停泊时间是 y(0<=y<=24)小时,求它们中任何一艘都不需要等候码头空出的概率是多少?
右移 >> 如:探测 a 的第 i 位是否为 1,可用 if (((1<<i)&a)>0) {};计算 a 与 b 的运算结果 赋值给 a,使用 a=a^b; 据说:同时做出 C、D 两题的同学能召唤神龙,好运。
Input
集训队里一共有 N 人(N<=1,000,000),两位队员可能有相同的编号 no(0<=no<=1,000,000,000),他们所交的奖牌就以上交队员的编号作为区分,共 有 2*N-1 块奖牌编号作为输入,每个测试文件只有一组数据。
} } }if(tie) printf("Tie\n"); } }
B:简单求平均
Time Limit: 1000MS Memory Limit: 615 Accepted: 95 65536K Total Submissions:
Description
我们都知道求平均数吧,即 ( A1+A2+……+An ) / n。这显然是很简单的。不过 一般一些比赛中各个评分要去掉最高分和最低分,然后对剩下的求平均。我的问 题也是如此,你要对输入的数去掉最高分和最低分后在求平均,并输出。
第一届浙江师范大学 C 语言程序设计竞赛解 题报告
(罗方炜,lfw2565295@126.com ,浙师大 10 计软)
比赛概述
首先是本届比赛的题目:
本次比赛的提交统计:
其中 B,F,H 相对简单,C,E,G 为中等题,A,D 为稍难题 本次比赛前十名的情况:
有两wenku.baidu.com同学成功解出 6 道,还有 6 名同学解出 5 道,4 道的还有些,同时恭喜前 5 名获得本次比赛的一等奖