Codeforces Round 938 (Div. 3)H-The Most Reckless Defense

news2024/10/6 1:46:28

来源

题目

You are playing a very popular Tower Defense game called "Runnerfield 2". In this game, the player sets up defensive towers that attack enemies moving from a certain starting point to the player's base.

You are given a grid of size n×m𝑛×𝑚, on which k𝑘 towers are already placed and a path is laid out through which enemies will move. The cell at the intersection of the x𝑥-th row and the y𝑦-th column is denoted as (x,y)(𝑥,𝑦).

Each second, a tower deals pi𝑝𝑖 units of damage to all enemies within its range. For example, if an enemy is located at cell (x,y)(𝑥,𝑦) and a tower is at (xi,yi)(𝑥𝑖,𝑦𝑖) with a range of r𝑟, then the enemy will take damage of pi𝑝𝑖 if (x−xi)2+(y−yi)2≤r2(𝑥−𝑥𝑖)2+(𝑦−𝑦𝑖)2≤𝑟2.

Enemies move from cell (1,1)(1,1) to cell (n,m)(𝑛,𝑚), visiting each cell of the path exactly once. An enemy instantly moves to an adjacent cell horizontally or vertically, but before doing so, it spends one second in the current cell. If its health becomes zero or less during this second, the enemy can no longer move. The player loses if an enemy reaches cell (n,m)(𝑛,𝑚) and can make one more move.

By default, all towers have a zero range, but the player can set a tower's range to an integer r𝑟 (r>0𝑟>0), in which case the health of all enemies will increase by 3r3𝑟. However, each r𝑟 can only be used for at most one tower.

Suppose an enemy has a base health of hℎ units. If the tower ranges are 22, 44, and 55, then the enemy's health at the start of the path will be h+32+34+35=h+9+81+243=h+333ℎ+32+34+35=ℎ+9+81+243=ℎ+333. The choice of ranges is made once before the appearance of enemies and cannot be changed after the game starts.

Find the maximum amount of base health hℎ for which it is possible to set the ranges so that the player does not lose when an enemy with health hℎ passes through (without considering the additions for tower ranges).

Input

The first line contains an integer t𝑡 (1≤t≤1001≤𝑡≤100) — the number of test cases.

The first line of each test case contains three integers n𝑛, m𝑚, and k𝑘 (2≤n,m≤50,1≤k<n⋅m2≤𝑛,𝑚≤50,1≤𝑘<𝑛⋅𝑚) — the dimensions of the field and the number of towers on it.

The next n𝑛 lines each contain m𝑚 characters — the description of each row of the field, where the character "." denotes an empty cell, and the character "#" denotes a path cell that the enemies will pass through.

Then follow k𝑘 lines — the description of the towers. Each line of description contains three integers xi𝑥𝑖, yi𝑦𝑖, and pi𝑝𝑖 (1≤xi≤n,1≤yi≤m,1≤pi≤5001≤𝑥𝑖≤𝑛,1≤𝑦𝑖≤𝑚,1≤𝑝𝑖≤500) — the coordinates of the tower and its attack parameter. All coordinates correspond to empty cells on the game field, and all pairs (xi,yi)(𝑥𝑖,𝑦𝑖) are pairwise distinct.

It is guaranteed that the sum of n⋅m𝑛⋅𝑚 does not exceed 25002500 for all test cases.

Output

For each test case, output the maximum amount of base health hℎ on a separate line, for which it is possible to set the ranges so that the player does not lose when an enemy with health hℎ passes through (without considering the additions for tower ranges).

If it is impossible to choose ranges even for an enemy with 11 unit of base health, output "0".

题意

有n*m的格子,“#”是敌人会经过的位置,有k个防御装置,有对应的位置和攻击力,对于每个防御装置,每增加r的攻击半径,怪物就会增加3^{r}点生命,问最多能防御多少点生命的怪物。

思路

       首先,可以发现r的取值不能很大,怪物的血量呈指数上升,稍微打一下表可以发现,r大于13的话就不可能杀死了。

       其次,一个防御建筑的有效攻击应该是,它能覆盖到的格子数*它的攻击力-它给怪物增加的血量。

       所以现在的问题就变成了,每个防御装置可以选择0-13半径的攻击范围,问最多能产生多少的有效攻击。因为半径的选择范围很小,可以用这一点进行状压dp

       首先可以先对每个防御塔,在不同的半径下能产生的有效伤害预处理。

bool check(int x,int y,int p,int q,int r){
	return (x-p)*(x-p)+(y-q)*(y-q)<=r*r;
}
 
for(int i=1;i<=k;i++){
    	int x,y,w;
    	cin>>x>>y>>w;
    	for(int j=0;j<=13;j++){
    		b[i][j]=0;
    		for(int p=1;p<=n;p++){
    			for(int q=1;q<=m;q++){
    				if(a[p][q]=='.')continue;
    				if(check(x,y,p,q,j))b[i][j]+=w;;
				}
			}
		}
	}

       定义dp[i][j]为前i个防御塔,用了j状态的半径(二进制的14位表示0-13是否使用),能产生的最多的有效攻击。

转移较为简单

for(int i=1;i<=k;i++){
		for(int j=0;j<(1<<14);j++){
			dp[i][j]=dp[i-1][j]+b[i][0];
			for(int p=1;p<=13;p++){
				if((j>>p)&1){
					dp[i][j]=max(dp[i][j],dp[i-1][j^(1<<p)]+b[i][p]);
				}
			}
		}
	}

最后比较每一种状态

#include <bits/stdc++.h>
using namespace std;
#define int long long
 
 
char a[55][55];
int dp[3000][1<<13];
int b[10000][20];
 
bool check(int x,int y,int p,int q,int r){
	return (x-p)*(x-p)+(y-q)*(y-q)<=r*r;
}
 
void solve(){
    int n,m,k;
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++){
        cin>>a[i]+1;
    }
    for(int i=1;i<=k;i++){
    	int x,y,w;
    	cin>>x>>y>>w;
    	for(int j=0;j<=13;j++){
    		b[i][j]=0;
    		for(int p=1;p<=n;p++){
    			for(int q=1;q<=m;q++){
    				if(a[p][q]=='.')continue;
    				if(check(x,y,p,q,j))b[i][j]+=w;;
				}
			}
		}
	}
	
	for(int i=1;i<=k;i++){
		for(int j=0;j<(1<<14);j++){
			dp[i][j]=dp[i-1][j]+b[i][0];
			for(int p=1;p<=13;p++){
				if((j>>p)&1){
					dp[i][j]=max(dp[i][j],dp[i-1][j^(1<<p)]+b[i][p]);
				}
			}
		}
	}
	int ans=0;
	for(int i=0;i<(1<<14);i++){
		int res=dp[k][i];
		int p=1;
		for(int j=1;j<=13;j++){
			p*=3;
			if((i>>j)&1)res-=p;
		}
		ans=max(ans,res);
	} 
	cout<<ans<<'\n';
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--)solve();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1638271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Delta lake with Java--利用spark sql操作数据2

上一篇文章尝试了建库&#xff0c;建表&#xff0c;插入数据&#xff0c;还差删除和更新&#xff0c;所以在这篇文章补充一下&#xff0c;代码很简单&#xff0c;具体如下&#xff1a; import org.apache.spark.sql.SaveMode; import org.apache.spark.sql.SparkSession;publi…

DRF中的请求入口分析及request对象分析

DRF中的请求入口分析及request对象分析 django restframework框架是在django的基础上又给我们提供了很多方便的功能&#xff0c;让我们可以更便捷基于django开发restful API 1 drf项目 pip install django pip install djangorestframework1.1 核心配置 INSTALLED_APPS [d…

【源码阅读】Golang中的go-sql-driver库源码探究

文章目录 前言一、go-sql-driver/mysql1、驱动注册&#xff1a;sql.Register2、驱动实现&#xff1a;MysqlDriver3、RegisterDialContext 二、总结 前言 在上篇文章中我们知道&#xff0c;database/sql只是提供了驱动相关的接口&#xff0c;并没有相关的具体实现&#xff0c;具…

PG数据库结构与oracle比较

1.数据库集簇逻辑结构 数据库集簇概念&#xff1a;一个大的数据库是由若干个小的数据库组成&#xff0c;实现数据的隔离存放&#xff0c;在概念上应该是与mysql一样的 在mysql中可以用show database列出数据库 PG中用\l 数据库对象存放在数据库中&#xff1a; PG中的所有数据…

Mac 上安装多版本的 JDK 且实现 自由切换

背景 当前电脑上已经安装了 jdk8; 现在再安装 jdk17。 期望 完成 jdk17 的安装&#xff0c;并且完成 环境变量 的配置&#xff0c;实现自由切换。 前置补充知识 jdk 的安装路径 可以通过查看以下目录中的内容&#xff0c;确认当前已经安装的 jdk 版本。 cd /Library/Java/Java…

Maven3.9.6下载安装教程

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ &#x1f440;&#x1f440;&#x1f440; 个人博客&#xff1a;小奥的博客 &#x1f44d;&#x1f44d;&#x1f44d;&#xff1a;个人CSDN ⭐️⭐️⭐️&#xff1a;Github传送门 &#x1f379; 本人24应届生一枚&#xff0c;技术和水平有…

Typescript精进:前端必备的5大技巧(AI写作)

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

瑞_23种设计模式_解释器模式

文章目录 1 解释器模式&#xff08;Interpreter Pattern&#xff09;1.1 介绍1.2 概述1.2.1 文法&#xff08;语法&#xff09;规则1.2.2 抽象语法树 1.3 解释器模式的结构1.4 解释器模式的优缺点1.5 解释器模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代…

【右一的开发日记】全导航,持续更新...

文章目录 &#x1f4da;前端【跟课笔记】&#x1f407;核心技术&#x1f407;高级技术 &#x1f4da;捣鼓捣鼓&#x1f407;小小案例&#x1f407;喵喵大王立大功&#x1f407;TED自用学习辅助网站&#x1f407;世界top2000计算机科学家可视化大屏&#x1f407;基于CBDB的唐代历…

【Java EE】MyBatis使用注解操作数据库

文章目录 &#x1f340;参数传递&#x1f334;增(Insert)&#x1f338;返回主键 &#x1f343;删(Delete)&#x1f333;改(Update)&#x1f332;查(Select)&#x1f338;起别名&#x1f338;结果映射&#x1f338;开启驼峰命名(推荐) ⭕总结 &#x1f340;参数传递 需求: 查找…

【JavaEE】进程的概念

文章目录 1、什么是进程&#xff08;Process&#xff09;2、PCB1.pid进程的id/标识符2.内存指针3.文件描述符表4、进程调度4.1状态4.2优先级4.3上下文4.4记账信息 1、什么是进程&#xff08;Process&#xff09; 一个程序&#xff0c;运行起来/跑起来&#xff0c;在操作系统中…

Delta lake with Java--利用spark sql操作数据1

今天要解决的问题是如何使用spark sql 建表&#xff0c;插入数据以及查询数据 1、建立一个类叫 DeltaLakeWithSparkSql1&#xff0c;具体代码如下&#xff0c;例子参考Delta Lake Up & Running第3章内容 import org.apache.spark.sql.SaveMode; import org.apache.spark.…

Ollamallama

Olllama 直接下载ollama程序&#xff0c;安装后可在cmd里直接运行大模型&#xff1b; llama 3 meta 开源的最新llama大模型&#xff1b; 下载运行 1 ollama ollama run llama3 2 github 下载仓库&#xff0c;需要linux环境&#xff0c;windows可使用wsl&#xff1b; 接…

面试:Spring(IOC、AOP、事务失效、循环引用、SpringMVC、SpringBoot的自动配置原理、Spring框架常见注解)

目录 一、Spring的单例Bean是否是线程安全的&#xff1f; 二、什么是AOP 1、介绍 &#xff08;1&#xff09;记录操作日志 &#xff08;2&#xff09;实现Spring中的事务 三、spring中事务失效的场景有哪些&#xff1f; 1、异常捕获处理 2、抛出检查异常 3、非public方…

ElasticSearch教程入门到精通——第四部分(基于ELK技术栈elasticsearch 7.x新特性)

ElasticSearch教程入门到精通——第四部分&#xff08;基于ELK技术栈elasticsearch 7.x新特性&#xff09; 1. Elasticsearch进阶1.1 核心概念1.1.1 索引Index1.1.1.1 索引创建原则1.1.1.2 Inverted Index 1.1.2 类型Type1.1.3 文档Document1.1.4 字段Field1.1.5 映射Mapping1.…

【Mac】Mac安装软件常见问题解决办法

前言 刚开始用Mac系统的小伙伴或者在更新系统版本后运行App的朋友会经常碰到弹窗提示「xxx已损坏&#xff0c;无法打开&#xff0c;您应该将它移到废纸篓」、「打不开xxx&#xff0c;因为Apple无法检查其是否包含恶意软件」、「打不开xxx&#xff0c;因为它来自身份不明的开发…

模型训练中的过拟合和欠拟合

基本概念 我们知道&#xff0c;所谓的神经网络其实就是一个复杂的非线性函数&#xff0c;网络越深&#xff0c;这个函数就越复杂&#xff0c;相应的表达能力也就越强&#xff0c;神经网络的训练则是一个拟合的过程。   当模型的复杂度小于真实数据的复杂度&#xff0c;模型表…

保存钉钉群直播回放下载:直播回放下载步骤详解

今天&#xff0c;我们就来拨开云雾&#xff0c;揭开保存钉钉群直播回放的神秘面纱。教会你们如何下载钉钉群直播回放 首先用到的工具我全部打包好了&#xff0c;有需要的自己下载一下 钉钉群直播回放工具下载&#xff1a;https://pan.baidu.com/s/1WVMNGoKcTwR_NDpvFP2O2A?p…

PyQt5新手教程(五万字)

文章目录 PyQt界面开发的两种方式&#xff1a;可视化UI 编程式UI一、PyQt 简介二、PyQt 与 Qt 的蒙娜丽莎三、PyQt 布局管理器3.1、简介3.2、项目实战3.2.0、添加伸缩项 layout.addStretch&#xff1a;控制布局中组件之间的间距。3.2.1、垂直布局管理器 QVBoxLayout&#xff1…

制作一个 rpm 软件包

首发日期 2024-04-30, 以下为原文内容: 本文以 ibrus (艾刷, 胖喵拼音 ibus 接口模块) 为例, 介绍 rpm 软件包的制作过程. 相关文章: 《发布 AUR 软件包 (ArchLinux)》 https://blog.csdn.net/secext2022/article/details/136803790《多种双拼方案的实现》 https://blog.csdn.…