#B、 斗恶龙

一道假水题

题目描述

一位勇士正在与恶龙战斗!他只会做出以下四种动作:

  1. 使自己的攻击力增加1点

  2. 使自己的攻击力降低1点(不会降低到0以下)

  3. 使自己的攻击力翻倍

  4. 对恶龙发起一次攻击

已知勇士的初始攻击力为0,每当勇士攻击恶龙时(即第4种动作),恶龙本该受到等同于勇士攻击力的伤害,由于恶龙非常抗打,如果勇士的攻击力大于等于100恶龙也只会受到100点伤害。

输入描述

第一行是一个正整数n表示勇士做出了n个动作。

第二行n个1−4之间的整数,表示勇士具体做了哪个动作。

输出描述

在一行中输出恶龙受到的伤害总和。

样例输入

 
  1. 12
  2. 1 3 3 3 3 3 3 4 2 4 3 4

样例输出

 
  1. 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;
}

记得点赞!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值