hdu 2060 Snooker

题目

这道题主要难在读题上(考英语)

讲的是斯诺克桌球游戏:

斯诺克规则是总共有15个红球和6个彩球,打球顺序为打一个红球,进球得1分,再打一个彩球

*如一红球被击进袋,该运动员可继续进行下一击球,且下一个活球应是该运动员所选的一个彩球。如该彩球被击进袋,可得分。然后再将彩球放回置球点。

*红球全部离台前,轮流交替地将红球与彩球击进袋,才能一杆继续下去。直到台面上最后一只红球被击落后,随之一个彩球也被击进袋,一杆球仍可继续进行。

*进球的彩球颜色相应分值(黄2 绿3 棕4 蓝5 粉6 黑7)。

题意:

给你桌上还剩的球数M,A当前的比分,对手B当前的比分。假如A能将桌上还剩的球数都打进,问他是否能获胜

思路:分有无红球,可分为6个球以上(有红球)的情况和6个球以下(无红球)的情况

 ① :当 m > 6时 ,应该将有颜色的球都取了,有色球得分为2 + 3  + 4 + 5 + 6 + 7 ,有色球总得分为27 ;然后再取红球 m  -  6 ,本来得分应该是 ( m - 6 ) * 1 ,但是由于有色球全部打进洞后,每个球需要额外增加黑球(最高得分)的得分;所以红球总得分为( m - 6 ) * 1 + ( m- 6 ) * 7 ;     总得分为( m - 6 ) * 8 + 27 ;

②:当 m <= 6 时 ,应该由价值最高的黑球( 7 分) 向前依次增加求和,又因为有色球满足等差数列                            (Sn=n*(a1+an)/2),由前6项减去前 6 - m项和,所以求得为( 7 - m  + 1 + 7  ) * m / 2 ( 这里直接通过得分来计算的)。因此,第二种情况的得分为( 15 - m ) *m/ 2 ;

#include <stdio.h>

int main()
{
    int T;
    int a,b,m;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&m,&a,&b);
        if(m>6)
            a = (m-6)*8+27+a;
        else
            a = (15-m)*m/2 + a;
        if(a>=b)
            printf("Yes
");
        else
            printf("No
");
    }
    return 0;
}





原文地址:https://www.cnblogs.com/qie-wei/p/10160202.html