山楂

Posted on 2022-03-04 22:19  ZheyuHarry  阅读(142)  评论(0编辑  收藏  举报

来源:牛客小白月赛45

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

 

题目:众所周知,清楚姐姐最近迷上了一个老年游戏“山楂串”(点进去可以玩)这个游戏中我们可以将3或4个iii级糖果合并,升级成为一个高一级的糖果并且获得x∗ix*ixi点积分,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<bits/stdc++.h>

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<<ans;
return 0;
}