这道题主要难在读题上(考英语)
讲的是斯诺克桌球游戏:
斯诺克规则是总共有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;
}