2011年宁波市中小学生程序设计竞赛初中组Pascal解题报告 下载本文

内容发布更新时间 : 2025/1/23 7:21:37星期一 下面是文章的全部内容请认真阅读。

18957880586(微信同号) 布尔编程——青少年编程领路人

2011宁波市中小学生程序设计竞赛初中组Pascal解题报告

1、斯诺克(snooker)

题目背景

镇海中学开设了很多校本选修课程,有体育类、音乐类、美术类、无线电测向、航空航海航天模型制作等,力争使每位学生高中毕业后,能学到一门拿得出手的兴趣爱好,为将来的终身发展打下基础。在体育类的校本选修课程中,有一门课程是斯诺克台球。

题目描述

斯诺克台球比赛中有21个球,其中有15个红球,6个彩球(黄、绿、棕、蓝、粉、黑)。甲乙二人轮流打球。打一个红球得1分,打一个彩球的得分如下: 黄球:2分; 绿球:3分; 棕球:4分; 蓝球:5分; 粉球:6分; 黑球:7分; 最后以得分高者为胜。 简化后的打球规则如下:

1.如果有红球,第奇数次必须打红球,打过的红球从桌面上拿走;

2.每打一个红球后,可以任意选一个彩球打,打红球后接着打的彩球不从桌面上拿走;

3、如果桌面上已经没有红球可打了,那么按照分值从小到大的次序打彩球,这时候每打一个彩球都从桌面上拿走。 打球时犯规的判罚如下: 1、没有打中球,给对方加4分;

2.没有按照打球规则打该打的球,即打中了错误的球时:

(1)如果这个错误的球的分值大于4,那么给对方加等于这个球的分值; (2)如果这个错误的球的分值不大于4,那么给对方加4分; 打中的错误球不从桌面上拿走。 请统计某局比赛进行到现在为止的比分。

1

布尔编程——青少年编程领路人 18957880586

输入格式

输入有两行,第一行有二个整数n和m,表示甲打了n个球,乙打了m个球。n和m之间以一个空格分隔。

第二行,有n个以空格分隔的整数,表示甲的n次连续打球情况。 第三行,有m个以空格分隔的整数,表示乙的m次连续打球情况。 第二行和第三行中:

(1)1至7的整数表示打了相应分值的球;

(2)最后一个数字是0,表示没有打中球犯规,0只会出现在这二行的最后一个数字处;

(3)打了错误球的犯规也只会出现在这二行最后一个数字处;

输入数据保证是正确,不会出现打到桌面上不存在的球的情况,数据不必检验。

输出格式

输出仅有一行,该行有二个整数(互相之间以一个空格分隔),表示比赛进行到现在为止甲乙二人的得分(先打的甲在前)。

样例输入

4 3 1 7 1 6 1 7 1

样例输出

15 9

说明

【样例说明】

甲依次打了红球、黑球、红球、粉球,甲得15分(1+7+1+6)。 乙依次打了红球、黑球、红球,乙得9分(1+7+1)。 【数据范围】

80%的数据,每次总是打中球的,并且每次打中的球总是正确的,没有犯规情况。100%的数据,会有未打中或犯规情况。 保证输出不超过2^64-1.

2

18957880586(微信同号) 布尔编程——青少年编程领路人

解题思路

一道非常水的题,纯模拟,循环,判断,没有任何的技术含量。但是,还是有许多要考虑的地方的,只要细心即可。

代码及注释

var

x,y:array[1..10000] of longint; n,m,i,ans1,ans2,red,temp:longint; begin

readln(n,m); for i:=1 to n do read(x[i]); readln; for i:=1 to m do read(y[i]);//输入

ans1:=0;ans2:=0;red:=15;temp:=2;

//ans1记录的是甲的总分,ans2记录的是乙的总分,red 表示桌面上剩余的红球,temp表示现在应打彩球的分数

for i:=1 to n-1 do begin//先将甲的前n-1个计入分数 ans1:=ans1+x[i]; if x[i]=1 then

dec(red);//剩余红球-1 if (x[i]<>1) and (x[i-1]<>1) then

temp:=x[i]+1;//应打彩球的分数累加 end;

if x[n]=0 then//没打中的话给对方加分 ans2:=ans2+4

else if x[n]=1 then//如果最后一个是红球

3