Topcoder SRM 563 Div1 500 SpellCards
题意
[题目链接]这怎么发链接啊。。。。。
有\(n\)张符卡排成一个队列,每张符卡有两个属性,等级\(li\)和伤害\(di\)。
你可以做任意次操作,每次操作为以下二者之一:
把队首的符卡移动到队尾。
使用队首的符卡,对敌人造成\(d_i\)点伤害,并丢弃队首的\(l_i\)张符卡(包括你所使用的符卡)。如果队列不足\(l_i\)张符卡那么你不能使用。
求出造成的伤害的总和的最大值。
\(1<=n<=50, 1<=li<=50, 1<=di<=10000\)
Sol
结论:如果选出的卡牌满足\(\sum l_i <= N\),那么总有一种方案打出这些牌
背包一下就van了
这个结论虽然看起来很显然 但是在考场上应该不是那么好发现吧
简单的证明一下:
序列上的问题比较难处理,我们把它们放到环上,这样可以消除操作1的影响
显然,选出的卡牌一定存在相邻的两个满足\(i - j > l_i\),也就是其中一个释放技能后不会干掉另一个(否则一定\(>N\))
我们把这张卡牌用掉,于是问题变成了一个相同的子问题。
#include<bits/stdc++.h>
using namespace std;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int f[100];
class SpellCards{
public:
int maxDamage(vector<int> l, vector<int> d) {
int N = l.size();
for(int i = 0; i < N; i++)
for(int j = N; j >= l[i]; j--)
f[j] = max(f[j], f[j - l[i]] + d[i]);
return *max_element(f + 1, f + N + 1);
}
};
int main() {
int N = read();
vector<int> l, d;
for(int i = 1; i <= N; i++) l.push_back(read());
for(int i = 1; i <= N; i++) d.push_back(read());
cout << SpellCards().maxDamage(l, d);
}
/*
7
1 2 2 3 1 4 2
113 253 523 941 250 534 454
*/
Topcoder SRM 563 Div1 500 SpellCards的更多相关文章
- SRM 563 Div1 500 SpellCards
Description 有n张符卡排成一个队列,每张符卡有两个属性,等级lili和伤害didi. 你可以做任意次操作,每次操作为以下二者之一: 把队首的符卡移动到队尾. 使用队首的符卡,对敌人造成di ...
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
- TopCoder SRM 675 Div1 Problem 500 LimitedMemorySeries1(分块)
题意 给定一个长度不超过$5*10^{6}$的数列和不超过$100$个询问,每次询问这个数列第$k$小的数,返回所有询问的和 内存限制很小,小到不能存下这个数列.(数列以种子的形式给出) 时限$10 ...
- SRM 618 DIV1 500
非常棒的组合问题,看了好一会,无想法.... 有很多做法,我发现不考虑顺序的最好理解,也最好写. 结果一定是两种形式 A....A dp[n-1] A...A...A sgma(dp[j]*dp[ ...
- SRM 615 DIV1 500
TC 都615了...时间过的真快啊. 第一次做出500分,心情还是很激动的,虽然看了很久的题解,TC官网上的题解,很详细,但是英语的...我搜了搜,发现一份日语的...好吧,我还是看看英语的吧... ...
- 求拓扑排序的数量,例题 topcoder srm 654 div2 500
周赛时遇到的一道比较有意思的题目: Problem Statement There are N rooms in Maki's new house. The rooms are number ...
- topcoder srm 440 div1
problem1 link 二分答案,然后计算总时间.跟$T$比较确定要增大答案还是减小答案. problem2 link 可以看作是以‘*’所在位置为根的树.所以每个非根节点都有一个父节点. 那么每 ...
- topcoder srm 714 div1
problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...
随机推荐
- postgreSQL PL/SQL编程学习笔记(六)——杂七杂八
1 PL/pgSQL Under the Hood This part discusses some implementation details that are frequently import ...
- 【python】10分钟教你用Python做个打飞机小游戏超详细教程
更多精彩尽在微信公众号[程序猿声] 我知道你们一定想先看效果如何 00 目录 整体框架 开始之前-精灵类Sprite 子弹类class Bullet 玩家飞机类class Player 敌机类clas ...
- VS2019和net core 3.0(整理不全,但是孰能生巧)
更新 net core 3.0 只能配合vs2019 net core 3.0 新特性 详情 IntelliCode 智能插件 live share ctrl+. 快速重构 调试中的数据断点(很棒) ...
- ubuntu下安装fcitx五笔输入法
安装fcitx输入法 sudo add-apt-repository ppa:fcitx-team/stable #添加安装源,apt-get 添加,night ...
- D. Minimum Diameter Tree Round #528 (Div. 2)【树】
一.题面 题目链接 二.分析 该题注意读题的时候有强调边的权值为非负(即可以为0),此题就是求树两个叶子节点之间的最短距离.为了使两个叶子节点之间的距离最短,那么其实就是让每个最后到叶子的那条路径尽量 ...
- C#.net 设置Access-Control-Allow-Origin来实现跨域
<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Contro ...
- CentOS7下php安装mcrypt扩展
https://blog.csdn.net/skykingf/article/details/40185405 以下步骤均为本人实际操作,可能与你的安装方法有所区别,但我会尽量排除疑惑) 大致步骤(1 ...
- restFull接口实现web
1. 模板引擎JSP的限制 在开始之前呢,我觉得我们有必要先去了解下 Spring Boot 2.0 官方文档中提到的如下内容: 模板引擎 除了REST Web服务之外,还可以使用Spring MVC ...
- 异步的模块合并管理器-m3m4版本和jquery版本(原创)
m3m4版本 (function(w){ var loading={} var models={} function define(name,args){ loading[name]=true mod ...
- PIE SDK神经网络聚类
1.算法功能简介 神经网络是模仿人脑神经系统的组成方式与思维过程而构成的信息处理系统,具有非线性.自学性.容错性.联想记忆和可以训练性等特点.在神经网络中,知识和信息的传递是由神经元的相互连接来实现的 ...