欢迎光临
我们一直在努力

【题解】WebGoC 100091.斯诺克

题目描述

同学们游览江南美景的时候,学到了一种流行的运动:斯诺克台球。

斯诺克台球比赛中有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至7的整数表示打了相应分值的球;
  •  最后一个数字是0,表示没有打中球犯规,0只会出现在这二行的最后一个数字处;
  •  打了错误球的犯规也只会出现在这二行最后一个数字处;
  • 输入数据保证是正确,不会出现打到桌面上不存在的球的情况,数据不必检验。


    输出格式

    直接输出比分,用1号颜色,大小为100的格式输出分数,分数、冒号之间的中心距离是100。


    输入/输出例子1

    输入:

    4 3

    1 7 1 6 

    1 7 1

    输出:

    image.png


    输入/输出例子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

    输出:

    image.png


    输入/输出例子3

    输入:

    5 3

    1 5 1 3 2

    1 5 1

    输出:

    image.png


    输入/输出例子4

    输入:

    5 3

    1 3 1 4 0

    1 6 6

    输出:

    image.png


    样例解释

    【样例说明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

    (进去后要登录)

    赞(0)
    未经允许不得转载:171主机测评 » 【题解】WebGoC 100091.斯诺克
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址