题目描述
同学们游览江南美景的时候,学到了一种流行的运动:斯诺克台球。
斯诺克台球比赛中有22个球,其中有1个白球,15个红球,6个彩球(黄、绿、棕、蓝、粉、黑)。甲乙二人轮流用白球去打球。打进一个红球得1分,打进一个彩球的得分如下:
| 黄球:2分 | 绿球:3分 | 棕球:4分 |
| 蓝球:5分 | 粉球:6分 | 黑球:7分 |
最后以得分高者为胜。
简化后的打球规则如下:
| 1.如果有红球,第奇数次必须打红球,打过的红球从桌面上拿走; |
| 2.每打一个红球后,可以任意选一个彩球打,打红球后接着打的彩球不从桌面上拿走; |
| 3.如果桌面上已经没有红球可打了,那么按照分值从小到大的次序打彩球,这时候每打一个彩球都从桌面上拿走。 |
打球时犯规的判罚如下:
| 1. 没有打中球,给对方加4分; |
|
2.没有按照打球规则打该打的球,即打中了错误的球时: (1)如果这个错误的球的分值大于4,那么给对方加等于这个球的分值; (2)如果这个错误的球的分值不大于4,那么给对方加4分; |
打中的错误球不从桌面上拿走。请统计某局比赛进行到现在为止的比分。
输入格式
- 第一行有二个整数n和m,表示甲打了n个球,乙打了m个球。n和m之间以一个空格分隔。
- 第二行,有n个以空格分隔的整数,表示甲的n次连续打球情况。
- 第三行,有m个以空格分隔的整数,表示乙的m次连续打球情况。甲打完n次后乙接着打m次。
第二行和第三行中:
输入数据保证是正确,不会出现打到桌面上不存在的球的情况,数据不必检验。
输出格式
直接输出比分,用1号颜色,大小为100的格式输出分数,分数、冒号之间的中心距离是100。
输入/输出例子1
输入:
4 3
1 7 1 6
1 7 1
输出:

输入/输出例子2
输入:
11 24
1 7 1 7 1 7 1 7 1 7 1
1 7 1 7 1 7 1 7 1 7 1 7 1 7 1 7 1 7 2 3 4 5 6 7
输出:

输入/输出例子3
输入:
5 3
1 5 1 3 2
1 5 1
输出:

输入/输出例子4
输入:
5 3
1 3 1 4 0
1 6 6
输出:

样例解释
【样例说明1】
甲依次打了红球、黑球、红球、粉球,甲得15分,( 1+7+1+6 );
乙依次打了红球、黑球、红球,乙得9分,( 1+7+1 );
【样例说明2】
甲每打一个红球后打一个黑球(共打了5次),最后打的是红球,得41分, 5*(1+7)+1=41 ;
乙每打一个红球后打一个黑球,打完所有红球后,按规则依次将黄、绿、棕、蓝、粉、黑球全部 打进,得99分, 9*(1+7)+2+3+4+5+6+7=99 ;
【样例说明3】
甲打到第5球时打错球犯规了,要给乙加4分。
【样例说明4】
甲打到第5球,没有打中,给乙加4分。乙打到第3球,打错6分球,给甲加6分。
数据范围
1<=n,m<=40
参考答案
int red = 15;
int nextColorBall;
int a_score = 0, b_score = 0;
int hitA[45];
int hitB[45];
int deal(int cnt, int who)
{
bool afterRed = false;
for (int i = 0; i < cnt; i++)
{
int hit;
if (who == 1)
{
hit = hitA[i];
}
else
{
hit = hitB[i];
}
bool is_last = (i == cnt – 1);
if (!is_last)
{
if (afterRed == true)
{
if (hit != 1)
{
if (who == 1)
a_score = a_score + hit;
else
b_score = b_score + hit;
}
afterRed = false;
}
else
{
if (red > 0)
{
if (hit == 1)
{
if (who == 1)
a_score = a_score + 1;
else
b_score = b_score + 1;
red = red – 1;
afterRed = true;
}
}
else
{
if (hit == nextColorBall)
{
if (who == 1)
a_score = a_score + hit;
else
b_score = b_score + hit;
nextColorBall = nextColorBall + 1;
}
}
}
}
else
{
if (hit == 0)
{
if (who == 1)
b_score = b_score + 4;
else
a_score = a_score + 4;
}
else
{
int tmp_red = red;
bool tmp_ar = afterRed;
int tmp_ncb = nextColorBall;
int tmp_a = a_score;
int tmp_b = b_score;
bool ok = false;
if (tmp_ar == true)
{
if (hit != 1)
{
ok = true;
if (who == 1)
tmp_a = tmp_a + hit;
else
tmp_b = tmp_b + hit;
}
tmp_ar = false;
}
else
{
if (tmp_red > 0)
{
if (hit == 1)
{
ok = true;
if (who == 1)
tmp_a = tmp_a + 1;
else
tmp_b = tmp_b + 1;
tmp_red = tmp_red – 1;
tmp_ar = true;
}
}
else
{
if (hit == tmp_ncb)
{
ok = true;
if (who == 1)
tmp_a = tmp_a + hit;
else
tmp_b = tmp_b + hit;
tmp_ncb = tmp_ncb + 1;
}
}
}
if (ok == true)
{
red = tmp_red;
afterRed = tmp_ar;
nextColorBall = tmp_ncb;
a_score = tmp_a;
b_score = tmp_b;
}
else
{
int add;
if (hit > 4)
add = hit;
else
add = 4;
if (who == 1)
b_score = b_score + add;
else
a_score = a_score + add;
}
}
}
}
return 0;
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++)
{
cin >> hitA[i];
}
for (int i = 0; i < m; i++)
{
cin >> hitB[i];
}
red = 15;
nextColorBall = 2;
a_score = 0;
b_score = 0;
deal(n, 1);
deal(m, 2);
p.text(a_score, 1, 100);
p.text(":",1,100,0,100,0);
p.text(b_score,1,100,0,200,0);
p.hide();
return 0;
}
题目链接:
https://v1.51goc.com/question/viewProgram/100091
(进去后要登录)



