首页 > 其他分享 >P1779 魔鬼杀手 题解&&思路

P1779 魔鬼杀手 题解&&思路

时间:2024-10-31 22:08:36浏览次数:1  
标签:min int 题解 dat && mxai include P1779

P1779 魔鬼杀手 题解&&思路

题目链接

分析题目性质

我们发现假如有状态表示 \(M\) 个方案选或不选,那么这个状态有唯一确定的结果,即结果不会随着施法的顺序而改变。

考虑 \(dp.\)

我们从题目出发,发现每个方案有单个攻击或者集体攻击,想一想从这个方面考虑。

又由于每一个方案是可以选择无限次的,不难想到 完全背包

思路

设 \(f_i\) 表示使用集体攻击造成伤害为 \(i\) 的最少魔力。

同时的,设 \(g_i\) 表示使用单个攻击造成伤害至少为 \(i\) 的最少魔力。

那么怎么统计呢?

我们可以采取先用集体攻击把怪打残,再用单个攻击补刀的方针(这个可以由题目性质得出)。

得出 \(f,g\) 之后,我们就可以考虑枚举 \(x\) 表示群体伤害为 \(x\),然后计算出把每个怪兽补刀完的代价 \(y\),最后的答案不难为:

\[\min_{1\leq i\leq Damage} f_x+y \]

代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <stdlib.h>
#include <cstring>
#define int long long
#define N 200005
#define M 105
using namespace std;
int n,m,a[M],mxai;
struct node{
	int cost,damage;
	bool type;
}dat[M];
int f[N],g[N];
signed main(){
	cin >> n;
	for (int i = 1;i <= n;i ++) cin >> a[i],mxai = max(mxai,a[i]);
	cin >> m;
	for (int i = 1;i <= m;i ++) {
		string s;
		cin >> s >> dat[i].cost >> s >> dat[i].damage;
		dat[i].type = (s == "All");
		if (dat[i].type && !dat[i].cost) return puts("0"),0;
		dat[i].damage = min(dat[i].damage,mxai);
	}
	for (int i = 1;i <= mxai;i ++) f[i] = g[i] = 1e17;//这里是为了防止后面相加的时候爆 long long.
	for (int i = 1;i <= m;i ++)
		if (dat[i].type)
			for (int j = dat[i].damage;j <= mxai;j ++)
				f[j] = min(f[j],f[j - dat[i].damage] + dat[i].cost);
	for (int i = 1;i <= m;i ++)
		if (!dat[i].type)
			for (int j = dat[i].damage;j <= mxai;j ++)
				g[j] = min(g[j],g[j - dat[i].damage] + dat[i].cost);
	for (int i = mxai - 1;i >= 0;i --) g[i] = min(g[i],g[i + 1]);
	int ans = 8e18;
	for (int i = 0;i <= mxai;i ++) {
		int res = f[i];
		for (int j = 1;j <= n;j ++)
			if (a[j] - i > 0)
				res += g[a[j] - i];
		ans = min(ans,res);
	}
	cout << ans;
	return 0;
}

标签:min,int,题解,dat,&&,mxai,include,P1779
From: https://www.cnblogs.com/high-sky/p/18519029

相关文章

  • 洛谷Python顺序结构题解合集
    P5705【深基2.例7】数字反转a=s[0]b=s[1]c=s[2]d=s[4]print(f"{d}.{c}{b}{a}")P5706【深基2.例8】再分肥宅水ans=float(a[0])/int(a[1])beizi=2*int(a[1])print(f"{ans:.3f}\n{beizi}")P5708【深基2.习2】三角形面积p=0.5*(a+b+c)ans=pow((p*(p-a)*(p-b)*(p-c)),0.5......
  • Navicat 连接 MySQL 失败:2002-can‘t connect to server on localhost(10061)问题解决
    连接不上问题可能有如下原因服务器安全组中没有配置3306端口mysql服务端口只开放本地了如下:修改/etc/mysql/mysql.conf.d/mysqld.cnf中bind-address和mysqlx-bind-address注释掉重启mysql服务systemctlrestartmysqlmysql登录用户的host为localhost只允......
  • CATIA许可证常见问题解答
    在使用CATIA软件的过程中,许可证问题常常是用户关心的焦点。为了帮助大家更好地理解和解决这些问题,我们整理了一份CATIA许可证常见问题解答,希望能为您提供便捷的参考。问题一:如何激活CATIA许可证?解答:激活CATIA许可证通常需要访问软件的官方平台或使用特定的许可证管理工具。您需......
  • 20241031模拟赛题解
    T1题目描述给定一个圆形蛋糕,被\(n\)条切割线分成\(n\)个扇形蛋糕块,按照顺时针编号,第\(i\)块上有\(a_i\)个草莓,第\(i\)条切割线到第\(i+1\)条切割线之间的部分是第\(i\)块蛋糕。Alice和Bob流选择切割线,假设Alice选择了第\(i\)条切割线,Bob选择了第\(j\)条......
  • Codeforces Global Round 27,D. Yet Another Real Number Problem 题解
    单调栈+贪心题意:给定一个序列从左往右对于每个索引iii,求出其前缀的数组可以进行任意次以下操作的条件下:选择......
  • 2024CCPC哈尔滨部分题解
    赛时被评测机卡死了M.奇怪的上取整求\(\sum_{i=1}^{n}f(n,i)\)\(Input\)第一行一个整数\(T(1<=T<=10^3)\),表示数据组数对于每组数据,一行一个整数\(n(1<=n<=10^9)\)\(Output\)对于每组数据,输出一行一个整数,表示答案。\(Sample\)35451114514————————21T10......
  • Apache Commons Net 共享SSLSession问题解决
        某些服务器会默认开启TLS会话恢复,如FileZillaServer1.0及以后的版本(相对于1.0以前版本就是先当与勾选了RequireTLSsessionresumptionondataconnectwhenusingPORTP)。ApacheCommonsNet目前是不支持TLS会话恢复的,所以我们只能通过重写FTPSClient来实现。不然你......
  • ZZJC新生训练赛第十二场题解
    难度分类(同一难度下按字典序上升)入门:G简单:C,E,A中等:F,D,B困难:HG-解题思路按照题意模拟即可G-代码实现#include<bits/stdc++.h>intmain(){std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);std::strings;......
  • P7408 [JOI 2021 Final] 地牢 3 题解
    Description有一个\(N+1\)层的地牢,在地牢里有\(M\)个玩家。地牢的每层从入口开始,用\(1\)到\(N+1\)的整数编号。玩家从\(1\)到\(M\)标号。玩家使用能量从一层移动到下一层。玩家从第\(i\(1\lei\leN)\)层移动到第\(i+1\)层所用的能量为\(A_i\)。因为这是一个......
  • CF1187题解
    前言这套题相对来讲难度不算高,并且质量也很好,建议尝试CF1187A一眼秒,但我没有考虑s,t只有这一种排列方式,所以取一下\(max(n-s,n-t)\)#include<bits/stdc++.h>usingnamespacestd;intT,n,s,t;intmain(){ scanf("%d",&T); while(T--){ scanf("%d%d%d",&n,&s,&t)......