求助!!!万分火急
  • 板块学术版
  • 楼主Bh_hurter
  • 当前回复4
  • 已保存回复4
  • 发布时间2025/6/14 13:43
  • 上次更新2025/6/14 16:39:04
查看原帖
求助!!!万分火急
1296743
Bh_hurter楼主2025/6/14 13:43

rt,想让大家帮忙看看蒟蒻这道很简单的模拟问题,但是蒟蒻不知道哪里犯抽0tps(是的,连2024普及初赛都能满分的细节佬也sweat了),求助!!!

我们都知道,XXS喜欢玩游戏,但是由于XXS年龄太小,游戏中有些规则他是不理解的。比如,某个游戏中需要进行不断的计算,然后得到最后的积分,而有些XXS太菜,根本计算不了,请你帮助一下他。游戏中人物有三个属性,血量值、法术值、输出值。血量值初始为1,上限为10;输出值初始为0,上限为10;
法术值初始为5000;注意:最开始的得分为0。 每一个时刻都会进行一个操作,操作如下:
Save,此时血量值增加1,法术值增加5000,如果血量值满了,那么法术值额外再增加5000。
Attack,此时如果输出值没有到上限,那么输出值增加1,然后法术值增加1000,如果输出值满了,那么执行Save操作,如果执行Save操作之前血量值不满,那么输出值变成0。
Miss,此时血量值减少1,输出值变成0,法术值保留到千位后减半(下取整),例如法术值为13999,先变成13,然后减半变成6,再* 1000变成6000。
Nothing,三个属性值不发生变化。
每一个时刻发生完操作,则获得X分数,X=血量值*法术值。如果血量为0或者所有操作做完,则结束游戏,请输出得分之和。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
const int N=1e3;
int t,f;
string s;
ll health=1,dps=0,magic=5000,x=0; 
void save(){
	health=min(health+1,(ll)10),magic+=5000;
	if(health==10) magic+=5000;
}
void attack(){
	dps=min(dps+1,(ll)10);
	magic+=1000;
}
void miss(){
	health=max(health-1,(ll)0);
	dps=0;
	if(magic<1000) magic=0;
	else {
		ll a=magic/1000;
		if(a%2==1) a--;
		magic=a/2*1000;
	}
}
int main(){
	cin>>t;
	while(t--){
		cin>>s;
		if(f==1) continue;
		if(s=="Save") save();
		else if(s=="Attack"){
			if(dps<10) attack();
			if(dps==10){
				if(health<10) dps=0;
				save();
			}
		}
		else if(s=="Miss") miss();
		if(health<=0){
			f=1;
		}
		x=x+health*magic;
	}
	cout<<x;
	
	return 0;
}
2025/6/14 13:43
加载中...