山楂


来源:牛客小白月赛45

C-山楂_牛客小白月赛45 (nowcoder.com)

 

题目:众所周知,清楚姐姐最近迷上了一个老年游戏“山楂串”(点进去可以玩)这个游戏中我们可以将3或4个iii级糖果合并,升级成为一个高一级的糖果并且获得x?ix*ix?i点积分,xxx为消耗同级糖果的数量,iii为你消耗的糖果等级,当你拥有了一个9级糖果也就代表你有了一串山楂串,这个时候你的9级糖果就会消失。     请问 如果给定你每级若干个糖果,你最多能得到多少积分。   题解:如果简单概括一下题意就是我们要一层层的升级我们的山楂串,然后要让每次消耗的山楂尽可能多,且对下一等级的山楂增益越多;   仔细分析一下,其实这也就是一道很简单的关于数论的题目,我们其实分类讨论的是当前元素关于3的余数; ·首先,如果这里的山楂数目既可以被三整除也可以被四整除,我们肯定要选择被三整除,因为这样能对下一等级的山楂数目增加更多的值 ·其次,如果余1的情况,只要该元素不等于1,我们就一定能全部用完,因为当前是3n+1(n>=1) => 3(n-1) +4*1;(拆成了3和4的乘积和),并且3的组合数少1,4的组合数加1,所以对下一级元素的增益不变; ·最后,如果余2的情况,如果该元素是2,直接continue,如果是5,因为只能往后面增1,所以选择4的组合,为使当前等级的山楂消耗的更多(贪心); 不然的话就是3n+2 => 3(n-2) +4*2;(拆成了3和4的乘积和),并且3的组合数少2,4的组合数加2,所以对下一级元素的增益不变;   ·注意要用long long 哦!   code:

#include

using namespace std;

int main()
{
long long a[10];
for(int i = 1;i<=8;i++) cin>>a[i];
long long ans = 0;
for(int i = 1;i<=8;i++)
{
if(a[i]%3 == 0 )
{
ans+=(a[i]*i);
a[i+1] += (a[i]/3);
}
else if(a[i]%3 == 1){
if(a[i]>1){
ans += a[i]*i;
a[i+1] += a[i]/3;
}
}
else{
if(a[i] == 5){
ans += 4*i;
a[i+1]++;
}
else if(a[i] == 2) continue;
else{
ans+=a[i]*i;
a[i+1] += a[i]/3;
}
}
}
cout<ns;
return 0;
}

 

 

相关