zoukankan      html  css  js  c++  java
  • 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;
    }
    





  • 相关阅读:
    在 Laravel 5.1 中使用 Pjax
    在 iOS 中实现方法链调用
    利用 WireShark 深入调试网络请求
    设计一个健壮的后台下载
    设计一个健壮的大型文件下载系统
    iOS开发基础知识:Core Animation(核心动画)
    开发 Swift 和 Objective-C 混编的 Framework
    protobuf3 iOS 接入 protobuf
    iOS之ProtocolBuffer搭建
    iOS10 推送必看(基础篇)
  • 原文地址:https://www.cnblogs.com/qie-wei/p/10160202.html
Copyright © 2011-2022 走看看