B: 小李打台球
题目描述
在异乡打拼的小李同志迷上了一款叫斯诺克的台球游戏,而且随着练习的深入,他总是能在某些神奇的时候开启外挂模式,此时小李指哪打哪,直至无球可打。现在小李想让你帮他计算下当他开启外挂模式的时候最多可以取得多少分数。
注意:台面上的球数经常会异于传统斯诺克。
斯诺克比赛的基本规则如下:
一、彩球共分8种颜色,红(1分)、黄(2分)、绿(3分)、棕(4分)、蓝(5分)、粉(6分)、黑(7分)、白(主球,控制白球大其余球)。
二、当台面上有红球的时候你必须先击打一个红球,然后只能击打一个彩球(不包括红球),此时落袋的彩球将会被放回桌面,一直重复该过程。
三、当打完规则二的彩球(不包括红球)发现已经没有红球时,按彩球的分值从高到低将其依次击入袋中。
输入
输入仅有一行,共7个用空格隔开的整数,分别为当前台面上红、黄、绿、棕、蓝、粉、黑球的数目。
输出
输出仅有一行,共1个整数,表示小李可以得到的最高得分。
样例输入
2 0 1 0 3 0 2
样例输出
48
提示
台面上共有红球2个、绿球1个、蓝球3个、黑球2个,获得最高分的打法是红-黑-红-黑-绿-蓝-蓝-蓝-黑-黑,共可以获得48分。
保证最后得分不超过2^31-1.
解题思路
注意只有红球和没有红球的情况,其余按题意模拟即可
AC代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<sstream>
#include<queue>
#include<map>
#include<bitset>
#include<deque>
#define ll long long
using namespace std;
int main()
{
int a[7];
int i,maxpoint,sum;
for(i=0;i<7;i++)
cin>>a[i];
for(maxpoint=6;maxpoint>0;maxpoint--)
if(a[maxpoint]!=0) //找出分值最高的彩球
break;
if(maxpoint==0&&a[0]!=0) //只有红球
{
cout<<1<<endl;
return 0;
}
sum=a[0]+a[0]*(maxpoint+1);
for(i=6;i>0;i--)
sum+=a[i]*(i+1);
cout<<sum<<endl;
return 0;
}