首页 > 其他分享 >2022/10/7 T3 boss挑战

2022/10/7 T3 boss挑战

时间:2022-10-07 21:11:48浏览次数:83  
标签:10 int 蓝值 hp T3 回合 2000 2022 fhp

题目地址

题目大意:给你敌人的生命值,你的生命值、愤怒值、蓝值,愤怒值可以在普攻造成伤害的同时回复,生命和蓝值可以喝药回,愤怒值和蓝值可以放大招造成伤害,每回合你先选一种行动,行动完敌人对你造成伤害,判断规定回合内是否能赢、最早什么时候赢、会不会死。

我们考虑定义dp数组 \(f[回合数][生命值][蓝值][愤怒值]=造成伤害\) 然而根据此题的数据范围显然会又T又MLE,

考虑生命值、蓝值、愤怒值的计算互不影响,我们可以对他们分别拆开来做拆分dp,计算最终答案只需扫描结束所用的回合数1~n,用当前回合数减去活到当前回合最少喝药次数后的剩余回合数遍历对蓝系统和愤怒系统的分配回合数量的不同方案,若有可以杀死对手的方案,直接输答案为当前回合数,否则若最后一回合结束后发现没有活着的方案输“No”,其余就为“Tie”

时间复杂度\(\Theta(n^2+n(hp+mp*n1+sp*n2))\)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll t,n,m,a[10000],n1,b[100],y[100],n2,c[100],z[100],mxs[2000],mxm[2000],mnh[2000];
ll dhp,dsp,dmp,x,hp,mp,sp,fhp[2000][2000],fsp[2000][2000],fmp[2000][2000],ans,cnt,willdead;
int main(){
	freopen("boss.in","r",stdin);
	freopen("boss.out","w",stdout);
	cin>>t;
	for(int o=0;o<t;o++){
		cin>>n>>m>>hp>>mp>>sp>>dhp>>dmp>>dsp>>x;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		cin>>n1;
		for(int i=1;i<=n1;i++){
			cin>>b[i]>>y[i];
		}
		cin>>n2;
		for(int i=1;i<=n2;i++){
			cin>>c[i]>>z[i];
		}
		for(int i=0;i<=n+1;i++){
			for(int j=0;j<=1000;j++){
				fhp[i][j]=1e5;
				fsp[i][j]=0;
				fmp[i][j]=0;
				mxs[i]=0;
				mxm[i]=0;
				mnh[i]=1e5;
			}
		}
		fhp[1][hp]=0;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=hp;j++){
				if(fhp[i][j]!=1e5){
					if(j-a[i]>0)fhp[i+1][j-a[i]]=min(fhp[i][j],fhp[i+1][j-a[i]]);
					if(j-a[i]>0&&i!=n)fhp[i+1][min(hp,j-a[i]+dhp)]=min(fhp[i][j]+1,fhp[i+1][min(hp,j-a[i]+dhp)]);
				}
				mnh[i]=min(mnh[i],fhp[i][j]);
			}
		}
		for(int j=1;j<=hp;j++){
			mnh[n+1]=min(mnh[n+1],fhp[n+1][j]);
		}
		for(int i=0;i<=n;i++){
			for(int j=0;j<=mp;j++){
				fmp[i+1][min(j+dmp,mp)]=max(fmp[i+1][min(j+dmp,mp)],fmp[i][j]);
				mxm[i]=max(mxm[i],fmp[i][j]);
				for(int k=1;k<=n1;k++){
					if(j-b[k]>=0)fmp[i+1][j-b[k]]=max(fmp[i][j]+y[k],fmp[i+1][j-b[k]]);
				}
			}
		}
		for(int i=0;i<=n;i++){
			for(int j=0;j<=sp;j++){
				fsp[i+1][min(sp,j+dsp)]=max(fsp[i+1][min(sp,j+dsp)],fsp[i][j]+x);
				mxs[i]=max(mxs[i],fsp[i][j]);
				for(int k=1;k<=n2;k++){
					if(j-c[k]>=0)fsp[i+1][j-c[k]]=max(fsp[i+1][j-c[k]],fsp[i][j]+z[k]);
				}
			} 
		}
		ans=0;
		willdead=0;
		for(int i=1;i<=n;i++){
			for(int j=0;j<=i-mnh[i];j++){
				ans=max(ans,mxs[j]+mxm[i-mnh[i]-j]);
				if(ans>=m){
					cout<<"Yes "<<i<<endl;
					break;
				}
				
			}
			if(ans>=m)break;
		}
		if(ans<m){
			if(mnh[n+1]>n)cout<<"No"<<endl;
			else cout<<"Tie"<<endl;
		}
	}
	return 0;
}

标签:10,int,蓝值,hp,T3,回合,2000,2022,fhp
From: https://www.cnblogs.com/fluffy-stoat/p/16765429.html

相关文章

  • #yyds干货盘点# LeetCode 热题 HOT 100:最小路径和
    题目:给定一个包含非负整数的m x n 网格 grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。 示例1:输入:grid=......
  • 逆向工程核心原理——DLL注入 虽然原版是针对win7 32位的 我自己使用vs2022 在win11 6
    逆向工程核心原理——第二十三章 先说我自己本机win1164位上注入记事本的效果:  虽然弹出一个窗口。但是还是成功了:   生成了index.html文件  ......
  • 10第三章:【01】UML类图
    一、UML基本介绍1、UML——UnifiedModelingLanguageUML(统一建模语言),它是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的......
  • 2022-2023-1 20221407
    进制转换班级......
  • Educational Codeforces Round 100 (Rated for Div. 2) B. Find The Array(思维)
    https://codeforces.com/contest/1463/problem/B题目大意:给定n个数字的数组a,让我们凑出数组b;满足b[i]要么可以整除b[i+1],要么可以被b[i+1]整除,同时2*求和abs(a[i]-b[......
  • mPaaS x Menxlab | 1024程序员节:Talk is cheap,Show me the AppID
    有这样一群人他们的灵魂和身体总有一个在写代码他们自称码农/程序猿/程序媛但无论使用的是JAVA、PHP、Python、GO、SQL……在计算机面前,他们都简单直接程序员群体,往往......
  • 2022.10.7
    ACM。结果不是很好。一开始的节奏是很好的,但从A题调不出来开始就乱了。每个人再自己的题上都有深入思考,但对别人的情况不了解,所以讨论的效率实际不高,而且很容易被套进死胡......
  • 2022牛客国庆集训派对day6 A(极大矩阵计数)
    2022牛客国庆集训派对day6A(极大矩阵计数)A-All-oneMatrices_2022牛客国庆集训派对day6(nowcoder.com)题目求可以构成给出的01矩阵的全1极大矩阵数目思路悬线法可......
  • 【闲话】2022.10.07
    发现似乎我妈登上博客园了那我是不是该收敛点啊总之今天考了场试啊密码还是我的某中文网名全拼。还是相对论:只要大家都挂了那我就没有挂————bikuhiku看......
  • 2022-10-07-学习内容
    1.设置文本字体大小1.1activity_text_size.xml<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"......