首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

HDU 2060 Snooker:斯诺克得分規則數學建模

     編輯:關於C++

問題描述

斯诺克桌面上有 n 顆球。選手 A 當前得分 a,選手 B 得分 b。假設 A 將剩餘所有球全打進,問 A 能否超過或追平 B(即 a + 剩餘球最大得分 ≥ b)。

斯诺克得分規則簡述

  • 紅球:1 分,共 15 顆(初始)。打進一顆紅球後,必須緊接打進一顆彩球(黃2、綠3、棕4、藍5、粉6、黑7),彩球打進後重新放回檯面,紅球不放回。
  • 紅球打完後,按順序打彩球(黃→綠→棕→藍→粉→黑),此時彩球不再放回。

剩餘球最大得分計算

設剩餘球數 n(包含紅球和彩球)。

情況 1:n > 6

說明仍有紅球存在(因彩球固定 6 顆)。剩餘紅球數 = n - 6。
每顆紅球可搭配最高分彩球(黑球 7 分):
紅球得分 = (n-6) × 1
搭配黑球得分 = (n-6) × 7
紅球打完後,依次打 6 顆彩球:2+3+4+5+6+7 = 27
總得分 = (n-6)×8 + 27

情況 2:n ≤ 6

無紅球,只剩彩球。為最大化得分,剩餘必為分值最高的 n 顆彩球。
彩球分值:7,6,5,4,3,2(黑到黃)。
前 n 項和 = (7 + (7-n+1)) × n / 2 = (15-n) × n / 2?
實際:最大 n 個數為 7,6,...,(8-n)。和 = (7 + 8-n) × n / 2 = (15-n)n/2。
總得分 = (15-n)n/2

判斷邏輯


if (n > 6) maxAdd = (n-6)*8 + 27;
else maxAdd = (15-n)*n/2;
if (a + maxAdd >= b) "Yes" else "No"

樣例驗證

輸入:n=7, a=0, b=35
n>6 → maxAdd = 1×8+27=35 → a+maxAdd=35 ≥ 35 → Yes。

代碼實現


#include 
using namespace std;
int main() {
    int T; cin >> T;
    while (T--) {
        int n, a, b; cin >> n >> a >> b;
        int maxAdd = (n > 6) ? (n-6)*8 + 27 : (15-n)*n/2;
        cout << (a + maxAdd >= b ? "Yes" : "No") << '\n';
    }
    return 0;
}

總結

本題核心是理解斯诺克規則並建立剩餘球最大得分公式。分 n>6(有紅球)與 n≤6(純彩球)兩種情況,公式推導清晰,代碼極短。屬於數學建模類水題,關鍵讀懂題意並正確推導公式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved