1.题意
玩snooker(斯诺克)游戏,一共有21只目标球,15只红球(红球每个为1分,6只彩球(分值分别是2,3,4,5,6,7)。游戏规则是如果桌面上还有红球,就必须先打红球,打入洞可以再打彩球,彩球打入洞后可以拿出来并获得相应的分数,赢了后可以交替循环。如果桌面上没有红球了,只有彩球,那么这时候打彩球只能按着一定的顺序来打,从2,3一直到7分球,(桌上没有红球后,最后的这几个彩球打入洞后不用拿出来,直接加上相应的分数)。
刚开始我看不懂,然后就去下载 qq游戏:腾讯桌游 玩了几把。然后直到它是怎样统计分的了。
2.做法 与 错误点
做法:
本题其实是以桌面上的求数来决定的。设球数为 ball_left, 我的分数为 p_score, 对手分数为 o_score.
①。.如果有大于6个球,说明还有6个彩球,ball_left - 6个红球,那么为了获取最大的分数,我必须ball_left-6个红球全中。每次中后还有一次机会打彩球,为了最大值,我必须打分数最高的值(7分,黑球),因此我需要(ball_left-6)*1 + (ball_left-6)*7。再加上红球打完后还有6个彩球,为了获取最大分,我必须全赢,即2,3,4,5,6,7,一共27分。那么将这3个结果加起来即我最高还可以打多少分。即(ball_left-6)*1 + (ball_left-6)*7 + 27.
②。正好还有6个球,则只剩下彩球,即加上27分即可。
③。少于6个求,则只剩下彩球,设定一个数组sc[7] = {0,2,3,4,5,6,7},代表他们的分数,然后还剩几个球,就从第几个开始统计分数,然后加到末尾即可。
最后把我的分数与增加的分数相加,判断我的最终最大分数与对手分数大小,如果最大分数>=对手分数,那么我有可能赢,否则没可能。
易错点:
我忘了写>=中的=号,造成了WA,希望不要忘了这个细节。
3.代码
#include <iostream>
using namespace std;
int sc[7] = {0,2,3,4,5,6,7};
int main()
{
int kase;
int ball_left,p_score,o_score;
cin >> kase;
while(kase--)
{
cin >> ball_left >> p_score >> o_score;
if(ball_left>=6)
{
p_score += (ball_left-6)*(1+7)+27;
}
else
{
for(int i = 6-ball_left+1; i<=6; i++)
p_score += sc[i];
}
if(p_score >= o_score)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}