一道假水题
题目描述
一位勇士正在与恶龙战斗!他只会做出以下四种动作:
-
使自己的攻击力增加1点
-
使自己的攻击力降低1点(不会降低到0以下)
-
使自己的攻击力翻倍
-
对恶龙发起一次攻击
已知勇士的初始攻击力为0,每当勇士攻击恶龙时(即第4种动作),恶龙本该受到等同于勇士攻击力的伤害,由于恶龙非常抗打,如果勇士的攻击力大于等于100恶龙也只会受到100点伤害。
输入描述
第一行是一个正整数n表示勇士做出了n个动作。
第二行n个1−4之间的整数,表示勇士具体做了哪个动作。
输出描述
在一行中输出恶龙受到的伤害总和。
样例输入
12
1 3 3 3 3 3 3 4 2 4 3 4
样例输出
227
样例解释
勇士总共对恶龙发起了3次攻击,共造成64+63+100=227点伤害。
数据规模
对于20%的测试用例:1≤n≤30。
对于40%的测试用例:1≤n≤60。
对于100%的测试用例:1≤n≤100000。
一眼就会,是吧?
看看100分的n范围吧~~~
如果有9000此攻击力翻倍,那unsigned long long还存的下吗?
(tip:unsigned是定义无符号形的关键词,感兴趣的小伙伴可以去搜一下)
那怎么办?
因为攻击力>=100只会造成100伤害,所以当攻击力减不回来时,直接当100000算;
代码如下:
时间复杂度O(n);
#include<bits/stdc++.h>
using namespace std;
long long sum,gj,s,n;
int main(){
cin>>n;
while(n--){
cin>>s;
if(s==1) gj++;
if(s==2)
{
if(gj>=1)gj--;
}
if(s==3)
{
long long a=1000000;
gj=min(a,gj*=2);
}
if(s==4){
if(gj<=100) sum+=gj;
else sum+=100;
}
}
cout<<sum<<endl;
}
记得点赞!!!