【问题描述】

斯诺克台球是一项古老而又时尚的运动,使用长方形球桌,台面四角以及两长边中心位置各有一个球袋,使用的球分为1个白球,15个红球和6个彩球共22个球。

其中母球(白球)1只,目标球21只。目标球中:红球15只各1分、黄球1只2分、绿球1只3分、咖啡球1只4分、蓝球1只5分、粉球1只6分、黑球1只7分。

djh.jpg

选手需要使用球杆撞击母球去击打目标球来完成得分,每局开始时总是先从红球开始。击球顺序为先打进红球(每次击打允许多个红球同时落袋),然后必须任意指定一个目标彩球击打,如果该彩球被打进(打进后需要再摆回),然后接着击打红球,直到红球全部落袋,然后以黄、绿、咖啡、蓝、粉红、黑的顺序逐个击球(不再摆回),最后以得分高者为胜。任何时候红球落袋都不再摆回,任何时候因犯规导致彩球落袋,彩球必须摆回。

斯诺克比赛由双方轮流击打,必须击打合规的目标球,打进则本方得到相应的分数并继续击打,未打进或犯规轮换为对方击打,未打进不得分,犯规将进行罚分处理。

犯规规则如下:

  1. 当击打目标球时,如果先击打到或同时击打到一个或多个其他颜色的球,或者有其他颜色的球落袋,或者打空(未击打到任何球),则视为犯规。此时需要比较目标球的分值和与本犯规相关的其他颜色的球的分值,取其中最高的分值,如果该分值小于4,则对方加4分,否则对方加该分值。
    
  2. 当击打红球落袋后,继续击打任意彩球时打空,即未打击到任何球,对方加4分。
    

相比正式的斯诺克比赛,本问题对规则进行了简化,任何时候都可以结束比赛并计算比赛结果,不考虑白球落袋的情况。

信息化时代的智能台球桌能自动记录实际比赛时的击打记录,并传送到后台,但该记录仅仅是流水记录,并且无参赛选手的任何信息,需要你编程计算每场比赛的比分,同时需要计算单杆100分及以上的情况(单杆得分是指选手一次连续击打所得分数之和)。

【输入形式】

输入第一行为正整数t (t≤100),表示有t组测试数据,每组数据代表一局比赛。

在输入中,球的颜色表示为:

           r-红色球 y-黄色球 g-绿色球 c-咖啡色球 b-蓝色球 p-粉红球 B-黑色球

接下来的每组数据包括若干行,每一行为一次击打的结果,为智能球桌记录下来的流水记录,每组数据最后一行为-1,表示每组数据的结束。

流水记录包含用空格分隔的2个部分:

首先撞到的球 落袋球及数量

第一部分“首先撞到的球”为一个字符串,可以是“rygcbpB”中1个或多个字符组合(可能有多个字符“r”),或为字符串“NULL”。为“NULL”时,第二部分必为空,表示该次击打未撞击到任何球也没有任何球落袋。当红球落袋后继续击打任意彩球时,该部分为“ygcbpB”中的任意单个字符时都认为是合规的目标球。

第二部分“落袋球及数量”为一个字符串,例如“r2gb”,代表本次击打有两个红球落袋,以及绿球和篮球落袋,红色球r后面有数字(大于0小于16),表示红球的落袋数,其他彩球后无数字。该部分可以为空,表示本次击打无球落袋。

比赛在A与B之间进行,每局比赛总是由A先开球。

【输出形式】

输出为t+1行,前t行每行输出用冒号分隔的两个整数,表示每局比赛A与B之间的比分;最后一行输出用冒号分隔的两个整数,表示t局比赛之后A与B之间获得的单杆100分及以上的次数之比(单杆得分是指选手一次连续击打所得分数之和)。

【样例输入】

3
r r1
B
r r2
c c
r r1
b g
-1
rp r1
r br2B
NULL
r r12
y y
g p
-1
rr r3
NULL
r r1
yg y
-1
【样例输出】

6:7
13:24
7:5
0:0
【样例说明】

第一局比赛:

A击打红球,打进1个红球,得1分,比分为 1:0

A继续击打任意彩球,打到黑球,未打进,不得分,比分为1:0

轮换为B击打红球,打进两个红球,得2分,比分为1:2

B继续击打任意彩球,打到咖啡球,打进咖啡球,咖啡球摆回,得4分,比分为1:6

B继续击打红球,打进一个红球,得1分,比分为1:7

B继续击打任意彩球,打到蓝球,打进绿球,犯规,取分值最大者蓝球,绿球摆回,对方加5分,比分为6:7

-1比赛结束

第二局比赛:

A击打红球,首先打到红球和粉球,犯规,打进1个红球和咖啡球,犯规,咖啡球摆回,取分值最大的粉球,对方加6分,比分为0:6

B击打红球,首先打到红球,打进蓝球、2个红球和黑球,犯规,蓝球和黑球摆回,取分值最大的黑球,对方加7分,比分为7:6

A击打红球,未打到任何球,犯规,对方加4分,比分为7:10

B击打红球,打到红球,打进12个红球,加12分,比分为7:22

B击打任意彩球,打到黄球,打进黄球,黄球摆回,得2分,比分为7:24

B击打黄球,打到绿球,打进粉球,犯规,粉球摆回,对方加6分,比分为13:24

-1比赛结束

第三局比赛:

A击打红球,打到2个红球,打进3个红球,加3分,比分为3:0

A击打任意彩球,打空,未打到任何球,对方加4分,比分为3:4

B击打红球,打到1个红球,打进1个红球,加1分,比分为3:5

B击打任意彩球,打到黄球和绿球,打进黄球,犯规,黄球摆回,取分值最高的绿球,绿球分值小于4,对方加4分,比分为7:5

-1比赛结束

3局比赛中无人单杆得分过100,最后一行输出0:0

【说明】
搬运大佬的

#include<iostream>
#include<map>
using namespace std;
struct people
{int n;int a[102];int sum;int dangan[102];int sss;
};
map<char,int>aa;
map<char,int>bb;
map<char,int>dd;
char cc[7]={'r','y','g','c','b','p','B'};
int main()
{aa['r']=1;aa['y']=2;aa['g']=3;aa['c']=4;aa['b']=5;aa['p']=6;aa['B']=7;int t;cin>>t;getchar();people A,B;A.n=t;B.n=t;string x,y,X;int m=0,k=0,p=0,hong=15,huang=1,lve=1,cafe=1,lan=1,fen=1,hei=1;for(p=0;p<t;p++){hong=15;huang=1;lve=1;cafe=1;lan=1;fen=1;hei=1;m=0;//m表示第几个人 A.a[p]=0;A.sum=0;A.dangan[p]=0;A.sss=0;B.a[p]=0;B.sum=0;B.dangan[p]=0;B.sss=0;x="";y="";k=0;//k表示第几轮 while(getline(cin,X)&&X!="-1"){x="";y="";if(X.find(" ")!=string::npos){x=x+X.substr(0,X.find(" "));y=y+X.substr(X.find(" ")+1);}else{x=x+X;y="";}dd.clear();dd['r']=0;dd['y']=0;dd['g']=0;dd['c']=0;dd['b']=0;dd['p']=0;dd['B']=0;for(int i=0;i<(int)x.length();i++){dd[x[i]]++;}int l=0;for(int i=0;i<7;i++){if(dd[cc[i]]!=0) l++;}bb.clear();bb['r']=0;bb['y']=0;bb['g']=0;bb['c']=0;bb['b']=0;bb['p']=0;bb['B']=0;for(int i=0;i<(int)y.length();i++){if(y[i]>'9'&&y[i]!='r') {bb[y[i]]++;}else if(y[i]=='r'&&(y[i+2]>'9'||i+2==(int)y.length())&&(y[i+1]>='1'&&y[i+1]<='9')) {bb[y[i]]=bb[y[i]]+(y[i+1]-'0');i++;}else if(y[i]=='r'&&(y[i+2]>='0'&&y[i+2]<='9')&&(y[i+1]>='1'&&y[i+1]<='9')){bb[y[i]]=bb[y[i]]+(y[i+1]-'0')*10+(y[i+2]-'0');i=i+2;}}int q=0;for(int i=0;i<7;i++){if(bb[cc[i]]!=0) q++;}if(x=="NULL")//x为空 {k=0;if(m%2==0) {B.a[p]=B.a[p]+4;m++;}else {A.a[p]=A.a[p]+4;m++;}}else{if(hong>0&&k%2==0&&l==1&&x[0]=='r'&&q==1&&y[0]=='r')//第一轮不犯规{k=1;if(m%2==0){A.a[p]+=bb['r'];A.sum+=bb['r']; }else {B.a[p]+=bb['r'];B.sum+=bb['r'];} }else if(hong>=0&&k%2!=0&&(int)x.length()==1&&x[0]!='r'&&q==1&&y[0]==x[0])//第二轮不犯规 {k=0;if(m%2==0){A.a[p]+=aa[y[0]];A.sum+=aa[y[0]];}else{B.a[p]+=aa[y[0]];B.sum+=aa[y[0]];}}else if(k%2==0&&x[0]=='r'&&hong>0&&l==1&&(int)y.length()==0)//y为空 {if(m%2==0){if(A.sum>=100) A.dangan[p]++;A.sum=0;}else{if(B.sum>=100) B.dangan[p]++;B.sum=0;}m++;k=0;}else if(k%2!=0&&x[0]!='r'&&hong>=0&&l==1&&q==0)//y为空 {if(m%2==0){if(A.sum>=100) A.dangan[p]++;A.sum=0;}else{if(B.sum>=100) B.dangan[p]++;B.sum=0;}m++;k=0;}else if(k%2==0&&hong<=0){if(huang==1){if((int)x.length()==1&&(int)y.length()==1&&x[0]=='y'&&y[0]=='y'){if(m%2==0){A.a[p]+=aa[y[0]];A.sum+=aa[y[0]];}else{B.a[p]+=aa[y[0]];B.sum+=aa[y[0]];}huang=0;}else if((int)x.length()==1&&(int)y.length()==0&&x[0]=='y'){if(m%2==0){if(A.sum>=100) A.dangan[p]++;A.sum=0;}else{if(B.sum>=100) B.dangan[p]++;B.sum=0;}m++;}else{k=0;if(m%2==0){//if(bb['r']>7) B.a[p]+=bb['r'];if(bb['B']==1||dd['B']==1) B.a[p]+=7;else if(bb['p']==1||dd['p']==1) B.a[p]+=6;else if(bb['b']==1||dd['b']==1) B.a[p]+=5;else B.a[p]+=4;m++;if(A.sum>=100) A.dangan[p]++;A.sum=0;}else{//if(bb['r']>7) A.a[p]+=bb['r'];if(bb['B']==1||dd['B']==1) A.a[p]+=7;else if(bb['p']==1||dd['p']==1) A.a[p]+=6;else if(bb['b']==1||dd['b']==1) A.a[p]+=5;else A.a[p]+=4;m++;if(B.sum>=100) B.dangan[p]++;B.sum=0;}} } else if(huang==0&&lve==1){if(x.length()==1&&y.length()==1&&x[0]=='g'&&y[0]=='g'){if(m%2==0){A.a[p]+=aa[y[0]];A.sum+=aa[y[0]];}else{B.a[p]+=aa[y[0]];B.sum+=aa[y[0]];}lve=0;}else if(x.length()==1&&y.length()==0&&x[0]=='g'){if(m%2==0){if(A.sum>=100) A.dangan[p]++;A.sum=0;}else{if(B.sum>=100) B.dangan[p]++;B.sum=0;}m++;}else{if(m%2==0){//if(bb['r']>7) B.a[p]+=bb['r'];if(bb['B']==1||dd['B']==1) B.a[p]+=7;else if(bb['p']==1||dd['p']==1) B.a[p]+=6;else if(bb['b']==1||dd['b']==1) B.a[p]+=5;else B.a[p]+=4;m++;if(A.sum>=100) A.dangan[p]++;A.sum=0;}else{//if(bb['r']>7) A.a[p]+=bb['r'];if(bb['B']==1||dd['B']==1) A.a[p]+=7;else if(bb['p']==1||dd['p']==1) A.a[p]+=6;else if(bb['b']==1||dd['b']==1) A.a[p]+=5;else A.a[p]+=4;m++;if(B.sum>=100) B.dangan[p]++;B.sum=0;}} } else if(huang==0&&lve==0&&cafe==1){if(x.length()==1&&y.length()==1&&x[0]=='c'&&y[0]=='c'){if(m%2==0){A.a[p]+=aa[y[0]];A.sum+=aa[y[0]];}else{B.a[p]+=aa[y[0]];B.sum+=aa[y[0]];}cafe=0;}else if(x.length()==1&&y.length()==0&&x[0]=='c'){if(m%2==0){if(A.sum>=100) A.dangan[p]++;A.sum=0;}else{if(B.sum>=100) B.dangan[p]++;B.sum=0;}m++;}else{if(m%2==0){//if(bb['r']>7) B.a[p]+=bb['r'];if(bb['B']==1||dd['B']==1) B.a[p]+=7;else if(bb['p']==1||dd['p']==1) B.a[p]+=6;else if(bb['b']==1||dd['b']==1) B.a[p]+=5;else B.a[p]+=4;m++;if(A.sum>=100) A.dangan[p]++;A.sum=0;}else{//if(bb['r']>7) A.a[p]+=bb['r'];if(bb['B']==1||dd['B']==1) A.a[p]+=7;else if(bb['p']==1||dd['p']==1) A.a[p]+=6;else if(bb['b']==1||dd['b']==1) A.a[p]+=5;else A.a[p]+=4;m++;if(B.sum>=100) B.dangan[p]++;B.sum=0;}} }    else if(lan==1&&cafe==0&&huang==0&&lve==0){if(x.length()==1&&y.length()==1&&x[0]=='b'&&y[0]=='b'){if(m%2==0){A.a[p]+=aa[y[0]];A.sum+=aa[y[0]];}else{B.a[p]+=aa[y[0]];B.sum+=aa[y[0]];}lan=0;}else if(x.length()==1&&y.length()==0&&x[0]=='b'){if(m%2==0){if(A.sum>=100) A.dangan[p]++;A.sum=0;}else{if(B.sum>=100) B.dangan[p]++;B.sum=0;}m++;}else{k=0;if(m%2==0){//if(bb['r']>7) B.a[p]+=bb['r'];if(bb['B']==1||dd['B']==1) B.a[p]+=7;else if(bb['p']==1||dd['p']==1) B.a[p]+=6;else if(bb['b']==1||dd['b']==1) B.a[p]+=5;else B.a[p]+=4;m++;if(A.sum>=100) A.dangan[p]++;A.sum=0;}else{//if(bb['r']>7) A.a[p]+=bb['r'];if(bb['B']==1||dd['B']==1) A.a[p]+=7;else if(bb['p']==1||dd['p']==1) A.a[p]+=6;else if(bb['b']==1||dd['b']==1) A.a[p]+=5;else A.a[p]+=4;m++;if(B.sum>=100) B.dangan[p]++;B.sum=0;}} } else if(fen==1&&lan==0&&cafe==0&&huang==0&&lve==0){if(x.length()==1&&y.length()==1&&x[0]=='p'&&y[0]=='p'){if(m%2==0){A.a[p]+=aa[y[0]];A.sum+=aa[y[0]];}else{B.a[p]+=aa[y[0]];B.sum+=aa[y[0]];}fen=0;}else if(x.length()==1&&y.length()==0&&x[0]=='p'){if(m%2==0){if(A.sum>=100) A.dangan[p]++;A.sum=0;}else{if(B.sum>=100) B.dangan[p]++;B.sum=0;}m++;}else{if(m%2==0){//if(bb['r']>7) B.a[p]+=bb['r'];if(bb['B']==1||dd['B']==1) B.a[p]+=7;else if(bb['p']==1||dd['p']==1) B.a[p]+=6;else if(bb['b']==1||dd['b']==1) B.a[p]+=5;else B.a[p]+=4;m++;if(A.sum>=100) A.dangan[p]++;A.sum=0;}else{//if(bb['r']>7) A.a[p]+=bb['r'];if(bb['B']==1||dd['B']==1) A.a[p]+=7;else if(bb['p']==1||dd['p']==1) A.a[p]+=6;else if(bb['b']==1||dd['b']==1) A.a[p]+=5;else A.a[p]+=4;m++;if(B.sum>=100) B.dangan[p]++;B.sum=0;}} } else if(hei==1&&fen==0&&lan==0&&cafe==0&&huang==0&&lve==0){if(x.length()==1&&y.length()==1&&x[0]=='B'&&y[0]=='B'){if(m%2==0){A.a[p]+=aa[y[0]];A.sum+=aa[y[0]];}else{B.a[p]+=aa[y[0]];B.sum+=aa[y[0]];}hei=0;}else if(x.length()==1&&y.length()==0&&x[0]=='B'){if(m%2==0){if(A.sum>=100) A.dangan[p]++;A.sum=0;}else{if(B.sum>=100) B.dangan[p]++;B.sum=0;}m++;}else{if(m%2==0){//if(bb['r']>7) B.a[p]+=bb['r'];if(bb['B']==1||dd['B']==1) B.a[p]+=7;else if(bb['p']==1||dd['p']==1) B.a[p]+=6;else if(bb['b']==1||dd['b']==1) B.a[p]+=5;else B.a[p]+=4;m++;if(A.sum>=100) A.dangan[p]++;A.sum=0;}else{//if(bb['r']>7) A.a[p]+=bb['r'];if(bb['B']==1||dd['B']==1) A.a[p]+=7;else if(bb['p']==1||dd['p']==1) A.a[p]+=6;else if(bb['b']==1||dd['b']==1) A.a[p]+=5;else A.a[p]+=4;m++;if(B.sum>=100) B.dangan[p]++;B.sum=0;}} } }else//犯规 {k=0;if(m%2==0){//if(bb['r']>7) B.a[p]+=bb['r'];if(bb['B']==1||dd['B']==1) B.a[p]+=7;else if(bb['p']==1||dd['p']==1) B.a[p]+=6;else if(bb['b']==1||dd['b']==1) B.a[p]+=5;else B.a[p]+=4;m++;if(A.sum>=100) A.dangan[p]++;A.sum=0;}else{//if(bb['r']>7) A.a[p]+=bb['r'];if(bb['B']==1||dd['B']==1) A.a[p]+=7;else if(bb['p']==1||dd['p']==1) A.a[p]+=6;else if(bb['b']==1||dd['b']==1) A.a[p]+=5;else A.a[p]+=4;m++;if(B.sum>=100) B.dangan[p]++;B.sum=0;}}}hong=hong-bb['r'];}cout<<A.a[p]<<":"<<B.a[p]<<endl;if(A.sum>=100) A.dangan[p]++;if(B.sum>=100) B.dangan[p]++;}for(int i=0;i<t;i++){if(A.dangan[i]!=0) A.sss++;if(B.dangan[i]!=0) B.sss++;}cout<<A.sss<<":"<<B.sss;return 0;
}

湖南大学21夏训练四7.斯诺克台球相关推荐

  1. 湖南大学21夏训练四12.疫情期间

    [问题描述] 正值新冠疫情期间,阿迪没法返回学校学习,他希望通过参加一些比赛来提高一下编程技能,同时做做运动.他收集了接下来的 n 天里每一天的信息,包括健身房是否开放,或者互联网上是否有程序设计竞赛 ...

  2. 湖南大学21夏训练四20.恺撒Caesar密码

    [问题描述] Julius Caesar 生活在充满危险和阴谋的年代.为了生存,他首次发明了密码,用于军队的消息传递.假设你是Caesar 军团中的一名军官,需要把Caesar 发送的消息破译出来.并 ...

  3. 湖南大学21夏训练四2.最简单的计算机

    [问题描述] 一个名叫是 PigHeadThree 的研究组织设计了一台实验用的计算机,命名为 PpMm.PpMm只能执行简单的六种命令 A,B,C,D,E,F:只有二个内存 M1,M2:三个寄存器 ...

  4. 湖南大学21夏训练四18.身份证校验

    [问题描述] 我国国标[GB 11643-1999]中规定:公民身份号码是18位特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字 ...

  5. 湖南大学21夏训练四3.相同生日

    [问题描述] 在一个有n个人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的学号,出生月日,试找出所有生日相同的学生. [输入形式] 第一行为整数n,表示有n个学生,n<=200.此 ...

  6. 湖南大学21夏训练四16.逆序数

    问题描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数.也就是说,对于n个不同的元素,先规定各元素之间有 ...

  7. 湖南大学21夏训练四9.相等的多项式

    问题描述 小明现在在学习多项式的展开:就是把一个形如 (x+a1) (x+a2) - (x+an) 展开成如下形式: xn + b1xn-1 + b2xn-2 + - + bn-1x + bn 比如 ...

  8. 湖南大学21夏训练四4.日历问题

    [问题描述] 在我们现在使用的日历中, 闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年.例如:1700, 1800, 1900 和 2100 不是闰年,而 ...

  9. 湖南大学21夏训练四21.回文串

    问题描述 "回文串"是一个正读和反读都一样的字符串,比如"level"或者"noon"等等就是回文串.给你一个字符串,问最少在字符串尾添加多 ...

最新文章

  1. mysql curd操作_(四):CURD操作详解(增删改查)
  2. 洛谷 [P1314] 聪明的质检员(NOIP2011 D2T2)
  3. 如何使得WIN7下用VS2010做出的MFC程序具有XP风格(摆脱传统界面的效果)
  4. 华为笔记本搭载鸿蒙系统,华为MatePad Pro2入网!预装鸿蒙系统 搭载麒麟9000
  5. 大数据让远洋捕鱼不再空手而归 这就是马云说的新实体经济
  6. Android之SwipeRefreshLayout嵌套RecyclerView遇到的坑
  7. 【ZJOI2015】幻想乡战略游戏【点分树】【带权重心】
  8. Apache Arrow 内存数据
  9. scala.的Enumeration枚举示例(转)
  10. asp.net: 应用母版页的页面,如何设置其标题?
  11. Git-第N篇碰见的一些问题
  12. postgres常用SQL
  13. 关于勒索软件的硬道理:我们还没有准备好,这是一场与新规则的斗争,而且它的影响还没有接近顶峰。
  14. IG痛失亚军,含泪夺冠,奖杯是用区块链的技术合成的你知道吗
  15. 2019年南京大学计算机研究生复试分数线,2019年南京大学研究生复试分数线
  16. 千亿电子签赛道,谁是中国版DocuSign?
  17. python进程池multiprocessing.Pool和线程池multiprocessing.dummy.Pool实例
  18. DCT变换和DFT变换
  19. 鸟哥的Linux私房菜视频!
  20. 定义一个结构体student,存储学生的学号、名字、性别和年龄,读入每个学生的所有信息,保存在结构体中,并输出。

热门文章

  1. 均值归一化_机器学习之归一化(Normalization)
  2. 北京地铁,2号线换乘13号线,用时最短换乘线路
  3. STL —— multimap的用法详解
  4. 5.cisco思科模拟器ipv4和ipv6编址题目练习
  5. Unity --- 动画分层
  6. MySQL基础(二)查询语句知识点汇总
  7. Java获取邮箱联系人
  8. 盘点顶级加密 VC 的“3A 链游”布局,谁能扛起 Gamefi 的大旗?
  9. OpenSCA用开源的方式做开源风险治理:Why? What? How?
  10. 2019.03.24【SPOJ-GSS1】Can you answer these queries I(猫树)