怪兽

[Codeforces Round #625][Codeforces 1320C/1321E. World of Darkraft: Battle for Azathoth]

别等时光非礼了梦想. 提交于 2020-03-02 04:08:35
题目链接: 1320C - World of Darkraft: Battle for Azathoth / 1321E - World of Darkraft: Battle for Azathoth 题目大意:有\(n\)种剑,每种有对应的攻击值和价格、\(m\)种盾,每种有对应的防御值和价格。以及\(p\)个怪兽,每个怪兽有对应的攻击值、防御值、打败它获得的金币数量。要求购买 恰好 一种剑、一种盾,求打败所有能打败的怪兽后的最大收益(可以为负),其中打败一个怪兽的充要条件是:剑的攻击值 严格 大于怪兽的防御值,且盾的防御值 严格 大于怪兽的攻击值。 题解:考虑枚举在买第\(i\)种剑的前提条件下的最大收益,这时只有防御值小于其攻击力的怪兽才有可能被打败。把这些怪兽放到一个集合内,就相当于有若干个怪兽,求购买一个盾牌的最优解(攻击力小于该盾牌防御值的怪兽的收益和 - 盾牌价格 最大)。    于是我们可以对剑的攻击值排序,这样枚举\(i\)的时候,满足条件的怪兽集合一定是单调上升的。每次将怪兽加入集合后,便可以更新所有防御值大于其攻击值的盾的收益。显然这个可以通过离散化盾的防御值用线段树的区间加以及查询全局最大值来求解,但由于本人实在太弱不怎么会写线段树,不得已使用了分块的做法。不过交上去后发现实际运行时间只有374ms,甚至比一部分的线段树做法跑得还快,故拿出来分享一下_(

[AHOI2014/JSOI2014]骑士游戏

孤街浪徒 提交于 2020-02-06 10:41:18
题目背景 长期的宅男生活中,JYY又挖掘出了一款RPG游戏。在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽。 题目描述 在这个游戏中,JYY一共有两种攻击方式,一种是普通攻击,一种是法术攻击。两种攻击方式都会消耗JYY一些体力。采用普通攻击进攻怪兽并不能把怪兽彻底杀死,怪兽的尸体可以变出其他一些新的怪兽,注意一个怪兽可能经过若干次普通攻击后变回一个或更多同样的怪兽;而采用法术攻击则可以彻底将一个怪兽杀死。当然了,一般来说,相比普通攻击,法术攻击会消耗更多的体力值(但由于游戏系统bug,并不保证这一点)。 游戏世界中一共有N种不同的怪兽,分别由1到N编号,现在1号怪兽入侵村庄了,JYY想知道,最少花费多少体力值才能将所有村庄中的怪兽全部杀死呢? 输入格式 第一行包含一个整数N。 接下来N行,每行描述一个怪兽的信息; 其中第i行包含若干个整数,前三个整数为Si,Ki和Ri,表示对于i号怪兽,普通攻击需要消耗Si的体力,法术攻击需要消耗Ki的体力,同时i号怪兽死亡后会产生Ri个新的怪兽。表示一个新出现的怪兽编号。同一编号的怪兽可以出现多个。 输出格式 输出一行一个整数,表示最少需要的体力值。 输入输出样例 输入 #1复制 4 4 27 3 2 3 2 3 5 1 2 1 13 2 4 2 5 6 1 2 输出 #1复制 26 有点DP的感觉,但是有后效性

【JZOJ3674】【luoguP4042】【BZOJ3875】骑士游戏

我们两清 提交于 2019-12-14 16:01:51
description 在这个游戏中,JYY一共有两种攻击方式,一种是普通攻击,一种是法术攻击。两种攻击方式都会消耗JYY一些体力。采用普通攻击进攻怪兽并不能把怪兽彻底杀死,怪兽的尸体可以变出其他一些新的怪兽,注意一个怪兽可能经过若干次普通攻击后变回一个或更多同样的怪兽;而采用法术攻击则可以彻底将一个怪兽杀死。当然了,一般来说,相比普通攻击,法术攻击会消耗更多的体力值(但由于游戏系统bug,并不保证这一点)。 游戏世界中一共有N种不同的怪兽,分别由1到N编号,现在1号怪兽入侵村庄了,JYY想知道,最少花费多少体力值才能将所有村庄中的怪兽全部杀死呢? analysis 可以设 \(f[i]\) 表示彻底杀死 \(i\) 怪兽的最小值,则 \(f[i]=min(k[i],s[i]+\sum_{j\in son}f[j])\) 但是这种转移可以成环,所以不能用 \(DP\) 做,而这种类似松弛操作可以用 \(SPFA\) 来做 由于初始不知道从哪个点开始更新会最优,初始所有点都入队 \(dis[i]\) 表示最小花费,一开始也不知道物理攻击以后如何转化,先都赋值成 \(k[i]\) 更新 \(now\) 即为枚举所有 \(now\) 的儿子,拿 \(\sum_{j\in son}dis[j]\) 来更新 \(dis[now]\) 对于队首 \(now\) 的更新

D - Yet Another Monster Killing Problem

断了今生、忘了曾经 提交于 2019-12-05 06:50:27
题目连接: https://codeforces.com/contest/1257/problem/D 题目大意: n个怪兽,m个英雄,每个怪兽有一定的能力值,每个英雄有一定的能力值和一定的耐力值。耐力值得含义是每天可以击杀怪兽的最多数目。当英雄的能力值大于怪兽的能力值时,英雄可以击杀怪兽,然后问击杀 所有的怪兽所需要的最短时间,如果不能击杀所有怪兽,输出-1; 思路:主要是一个对一个mx数组的理解mx[i]的含义是在耐力值为i的情况下,英雄的最大能力。 #include<bits/stdc++.h> using namespace std; const int N=2E5+7; int arr[N]; int mx[N]; int p[N],abi[N]; void solve(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) mx[i]=0; for(int i=1;i<=n;i++) scanf("%d",&arr[i]); int m; scanf("%d",&m); for(int i=1;i<=m;i++){ scanf("%d%d",&abi[i],&p[i]); mx[p[i]]=max(mx[p[i]],abi[i]); } //一天可以击杀i个的英雄一定可以击杀i-1个。 //即mx[i

【AHOI2014/JSOI2014】骑士游戏

做~自己de王妃 提交于 2019-12-02 03:35:49
JYY一共有两种攻击方式,一种是普通攻击,一种是法术攻击 两种攻击方式都会消耗JYY一些体力。采用普通攻击进攻怪兽并不能把怪兽彻底杀死 怪兽的尸体可以变出其他一些新的怪兽,注意一个怪兽可能经过若干次普通攻击后变回一个或更多同样的怪兽 而采用法术攻击则可以彻底将一个怪兽杀死 游戏世界中一共有N种不同的怪兽,分别由1到N编号 在1号怪兽入侵村庄了,JYY想知道,最少花费多少体力值才能将所有村庄中的怪兽全部杀死呢 这真的是一道好题啊…… 一开始想的是,使用普通攻击杀死一个怪物,产生了分裂体 \(a_1\) ~ \(a_x\) 那么 \(ans[i]=min(f[i]+ans[a1]+...+ans[an],g[i])\) 乱写的式子,就是说杀死其本体分裂体的最小价值与直接杀死本体的价值取min 但是这样一直递归下去求解的话……好像没有初始位置来着? 分裂关系可能成环,那dp就废了 打开题解看一眼 仔细思索后发现居然要用spfa建模? 类比于 跳楼机 那道题,这个dp方程像spfa的松弛操作 那么类似的,我们搞个最短路来玩? 不过发现,并不能保证从一个定点开始跑出来的答案是最优的,所以初始化的时候要把所有节点入队 但现在仍然不能保证这样可以搞出正确答案啊? 毕竟这个队列的顺序并没有正确性 所以一旦更新了答案,就把当前点的父节点再次入队,看它的儿子是否有更优的解 代码: #include

C 怪兽游戏

旧巷老猫 提交于 2019-11-26 23:55:56
时间限制 : - MS 空间限制 : - KB 评测说明 : 1s,256m 问题描述 何老板在玩一款怪兽游戏。游戏虽然简单,何老板仍旧乐此不疲。 游戏一开始有N只怪兽,编号1到N。其中第i只怪兽的生命值为A i ,如果一只怪兽的生命值>0,那么它还活着。 游戏中,玩家可以反复进行下列操作: 任选一只活着的怪兽X,操控它去攻击任意一只活着的怪兽Y,被攻击的怪兽Y损失的生命值为攻击者X的当前的生命值。 当还剩一只活着的怪兽时,游戏结束。剩余那只怪兽的生命值越小,玩家在此局游戏的得分就越高。 何老板想知道,最后活着那只怪兽的生命值,最小可能是多少,请你帮他算一算。 输入格式 第一行,一个整数N 第二行,N个空格间隔的整数A 1 ,A 2 ,...A n 输出格式 一个整数,表示能够存活的怪兽的最小生命值 样例输入 1 4 2 10 8 40 样例输出 1 2 样例输入 2 4 5 13 8 1000000000 样例输出 2 1 样例输入 3 3 1000000000 1000000000 1000000000 样例输出 3 1000000000 提示 2 ≤ n ≤ 10 5 1 ≤ A i ≤ 10 9 【分析】    【标程】 来源: https://www.cnblogs.com/Limbo-To-Heaven/p/11335807.html

8.11欢乐赛

空扰寡人 提交于 2019-11-26 23:50:41
8.11欢乐赛 A.AK的距离 AK的距离 时间限制 : - MS 空间限制 : - KB 评测说明 : 1s,128m 问题描述 同学们总想AK。 于是何老板给出一个由大写字母构成的字符串,他想你帮忙找出其中距离最远的一对'A'和'K'。 比如下列字符串: BKABGKWAXKA 距离最远一对'A'和'K'的间距为6,它们之间间隔了6个字符。 输入格式 一行,一个由大写字母构成的字符串 输出格式 一个整数,表示A和K最远的间距。要求A必须在K的左侧,如果不存在,输出-1 样例输入 1 BKABGKWAXKA 样例输出 1 6 样例输入 2 KKKKKKKKKKAAAAAAAAAAAAAAA 样例输出 2 -1 提示 1<=字符串的长度<=10000 正排找出第一个‘A’,再找出最后一个‘K’,再算距离 很水就不说了。。。。 1 // 2 #include<stdio.h> 3 #include<bits/stdc++.h> 4 using namespace std; 5 string s; 6 int sum,a,b; 7 int main() 8 { 9 cin>>s; 10 for(int i=1; i<=s.size(); i++)//第一个A 11 { 12 if(s[i]=='A') 13 { 14 a=i; 15 break; 16 } 17 } 18 for