1433 - 云顶之弈
小狼近日沉迷于云顶之弈无法自拔,在这里面攒金币是很有学问的事,其中金币来源有以下几点 :
1、利息
如果你有一定数量的存款没花,上回合结束时,你每剩下101010金币,下回合开始时,就会额外获得111金币,最多555金币。所以如果你在这回合结束前有50金币,下回合开始时就能得到5金币的利息
2、每回合固定增长
第一回合222金币,第二回合333金币,第三、四回合444金币,第五回合以后都是555金币,这是固定的自然工资,在每回合开始时发放。
3、连胜,连败
当你连胜或连败一定次数,在下回合中你都会额外获得金币,场数越高额外金币越多(连胜或连败场次为23场时为111金币,46场时为222金币,7场以上为333金币。)
4、胜利
每次胜利,在回合结束时,都会获得111金币。
从第一回合开始,给出接下来nnn回合的胜利失败状态(111代表胜利,000代表失败),问nnn个回合之后小狼会有多少金币呢?
输入
每组输入的第一行为一个数字nnn,(2≤n≤1052\le n\le 10^52≤n≤105),接下来一行有n个数,每一个数字是111或000(111代表胜利,000代表失败)
输出
仅有一行输出,代表答案
样例
输入
复制
4
0 0 1 1
输出
复制
17
提示
样例中四个回合中的金币获得情况如下(按顺序获得金币):
第一个回合中:+0(利息),+0(之前无连胜连败),+2(工资),+0(失败)
第一回合结束时有2金币
第二个回合中:+0(利息),+0(之前仅一场失败),+3(工资),+0(失败)
第二回合结束时有5金币
第三个回合中:+0(利息),+1(之前有两场连败),+4(工资),+1(胜利)
第三个回合结束时有11金币
第四个回合中:+1(利息),+0(之前仅一场胜利),+4(工资),+1(胜利)
第四个回合结束时有17金币
来源
郑州大学软件学院第五届ACM程序设计竞赛
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a[100100],b[100100],c[100100],d[100100],m[100100];
memset(a,0,sizeof(a));memset(b,0,sizeof(b));
memset(d,0,sizeof(d));memset(m,0,sizeof(m));
c[1]=2;c[2]=3;c[3]=4;c[4]=4;
cin>>n;
for(int i=5;i<=n;i++)
{
c[i]=5;
}
for(int i=1;i<=n;i++)
{
cin>>d[i];
}
b[1]=0;b[2]=0;
int u=1;
for(int i=3;i<=n;i++)
{
if(d[i-1]==d[i-2])
{
u++;
}
if(d[i-1]!=d[i-2])
{
u=1;
}
if(u==1)
{
b[i]=0;
}
if(u==2||u==3)
{
b[i]=1;
}
if(u>=4&&u<=6)
{
b[i]=2;
}
if(u>=7)
{
b[i]=3;
}
}
m[1]=a[1]+b[1]+c[1]+d[1];
for(int i=2;i<=n;i++)
{
a[i]=m[i-1]/10;
if(a[i]>5)
{
a[i]=5;
}
m[i]=m[i-1]+a[i]+b[i]+c[i]+d[i];
}
cout<<m[n]<<endl;
}