2018年东北地区赛S - Problem I. Spell Boost HDU - 6508
题目地址:https://vjudge.net/problem/HDU-6508
思路:
给一些卡,分为四种卡。
1.白卡(没效果)
2.魔法,作用卡(会对作用卡的费用减少,也会被魔法卡作用)
3.作用卡(会被魔法卡作用使其费用减少)
4.魔法卡(会对作用卡的费用减少)
有一个想法:如果我们得到最大的攻击力,其中会用到魔法卡和作用卡或者两者效果都有的卡的话,魔法卡其实是越早用越好
,而作用卡越晚用晚用越好,因为作用卡会被魔法卡影响,使其费用减少,而且费用少的卡需要先使用,才能尝试更多的可能,
如果一张卡是10w,一张卡是1w,为了尝试更多可能,先让费用少的先尝试,(比如,先1w可以dp[1w],dp[1w+ 10w],但dp[10w],之前没有dp[1w])让费用多的之后对dp[N][N]进行比较。
那么,dp[N][N], 第一个维度为费用值,第二个维度为用了几张魔法卡,维护的是最大攻击力。
然后就是一个01背包问题,当然为了实现我们的想法,需要对结构体进行某些特定的排序。
补:其实可以这么想。我们打出了最好顺序情况的卡,那么我们的打出的卡中有其中几类的卡。那么,如果我们用了魔法卡,那我们一定先用魔法卡,用了作用卡,那么作用卡一定是之后用的,从最好的结果,来反推该背包该怎么dp,之后我看博客,想想这样更好理解,在这里补充一下。
#include<iostream>
#include<algorithm>
using namespace std;
#define rep(i,j,k) for(int i = (j); i <= (k); i++)
#define per(i,j,k) for(int i = (j); i >= (k); i--) const int N = ;
int dp[N][N]; struct node{
int w, x;
int is_m, is_s; bool friend operator < (node a, node b){
if (a.is_m != b.is_m) return a.is_m > b.is_m;//魔法卡先返回
else if (a.is_s != b.is_s) return a.is_s < b.is_s;//作用卡越晚用越好 return a.w < b.w;//先用费用小的,使其dp可以得到全部可能
}
}; node arr[N]; void init(int x){
// rep(i, 0, x)rep(j, 0, x) dp[i][j] = 0;
memset(dp, , sizeof(dp));
} int main(){ ios::sync_with_stdio(false);
cin.tie(); int n, W;
while (cin >> n >> W){ int m_num = ; rep(i, , n){
cin >> arr[i].w >> arr[i].x >> arr[i].is_m >> arr[i].is_s;
if (arr[i].is_m) ++m_num;//统计魔法卡数量
} init(n); sort(arr + , arr + + n); bool is_s = false;//判断是不是作用卡
//从大到小遍历,可以不影响之前的状态
rep(i, , n){
if (arr[i].is_m){ per(k, i, ){//魔法卡从多到少
per(j, W, ){//费用从多到少 int tmp_w = ;
if (arr[i].is_s){//有被作用效果
is_s = true;
tmp_w = max(, arr[i].w - (k - ));//触发魔法卡效果
}
//对于k张魔法卡,之前只有k-1张魔法卡,假如一张魔法卡去更新dp,所以被作用时
//应该是魔法卡数量-1的费用减少
if (is_s && tmp_w <= j){//是作用卡,费用足够
dp[j][k] = max(dp[j][k],dp[j - tmp_w][k - ] + arr[i].x);
}
else if (!is_s && arr[i].w <= j){//不是作用卡,费用足够
dp[j][k] = max(dp[j][k], dp[j - arr[i].w][k - ] + arr[i].x);
}
}
}
}
else {
//进入该部分时,全部的魔法卡使用情况已经存入dp,之后的都不是魔法卡
per(k, m_num, ){//m_num是魔法卡总数量,可能有不用魔法卡才能的到最大攻击的情况
per(j, W, ){ int tmp_w = ;
if (arr[i].is_s){
is_s = true;
tmp_w = max(, arr[i].w - k);
}
//对于k张魔法卡,被作用卡卡费用减少k
if (is_s && tmp_w <= j){
dp[j][k] = max(dp[j][k], dp[j - tmp_w][k] + arr[i].x);
}
else if (!is_s && arr[i].w <= j){
dp[j][k] = max(dp[j][k], dp[j - arr[i].w][k] + arr[i].x);
}
}
}
} is_s = false;
} int ans = ; rep(i, , m_num) ans = max(ans, dp[W][i]);//遍历费用是W的dp最大值,即为最大攻击力 cout << ans << endl;
} return ;
}
2018年东北地区赛S - Problem I. Spell Boost HDU - 6508的更多相关文章
- HDOJ 6508 Problem I. Spell Boost (01背包/DP)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6508 题目: Problem Description Shadowverse is a funny car ...
- 2018 东北地区大学生程序设计竞赛(ABEHIK)
HDU6500:Problem A. Game with string 题意: 给你一个字符串s以及它的m个子串的首尾位置,现在Alice和 Bob两个人轮流在任一子串的前面或者后面加1个字符,要求加 ...
- HDU 5924 Mr. Frog’s Problem 【模拟】 (2016CCPC东北地区大学生程序设计竞赛)
Mr. Frog's Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- 2016 CCPC 东北地区重现赛
1. 2016 CCPC 东北地区重现赛 2.总结:弱渣,只做出01.03.05水题 08 HDU5929 Basic Data Structure 模拟,双端队列 1.题意:模拟一个栈的操 ...
- [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania
[2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见&quo ...
- HDU 5923 Prediction(2016 CCPC东北地区大学生程序设计竞赛 Problem B,并查集)
题目链接 2016 CCPC东北地区大学生程序设计竞赛 B题 题意 给定一个无向图和一棵树,树上的每个结点对应无向图中的一条边,现在给出$q$个询问, 每次选定树中的一个点集,然后真正被选上的是这 ...
- HDU 5925 Coconuts 【离散化+BFS】 (2016CCPC东北地区大学生程序设计竞赛)
Coconuts Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- HDU 5929 Basic Data Structure 【模拟】 (2016CCPC东北地区大学生程序设计竞赛)
Basic Data Structure Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- HDU 5926 Mr. Frog's Game 【模拟】 (2016CCPC东北地区大学生程序设计竞赛)
Mr. Frog's Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
随机推荐
- JAVASCRIPT高程笔记-------第十章 DOM对象
10.1.1 node类型 --除IE外 所有浏览器都可以访问到这个类型 :JS中所有的节点类型都继承自Node类型 nodeName 与nodeValue 如果是一个元素 那么nodeName中保 ...
- 浏览器禁用cookie后php如何保持session会话-use_trans_sid机制
原文:浏览器禁用cookie后php如何保持session会话-use_trans_sid机制 为防止浏览器禁用cookie导致服务器会话无法保持,php开发了一个机制,该机制开启后,浏览器发起请求后 ...
- 第一次做C++项目的一点小总结
本人原本一菜鸟java程序员,但业余涉猎还算广泛,稍微了解些C++内容.主要之前曾爱好过汇编语言.所以对于C语言能从汇编层面加以理解,C++则是在此基础上又加了面向对象.stl等一类东西嘛. 这次做了 ...
- QT5.7静态编译(使用VS2013与VS2015编译,XP可用,有详细configure脚本。VS下Qt插件的配置。编译选项加上-mp可以开启多线程编译,编译速度提高2倍以上)
http://blog.csdn.net/u011964923/article/details/52886908 configure -confirm-license -opensource -pla ...
- UITableViewStyleGrouped 设置表头出现section不为0的问题
UITableViewStyleGrouped 设置表头出现section不为0的问题 1.如果使用UITableViewStylePlain样式的表格,那么header是会在表格滑动的时候在顶部悬浮 ...
- Python自动化测试 (八)unittest 单元测试
任何一种编程语言, 都会有单元测试框架, 本文介绍Python 自带的unittest模块 # -* - coding: UTF- -* - class Myclass: def sum(self,x ...
- hive Metastore contains multiple versions
凌晨接到hive作业异常,hive版本为1.2.1,hadoop版本apache 2.7.1,元数据存储在mysql中,异常信息如下: Logging initialized using config ...
- 《HelloGitHub》第 39 期
兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...
- Hexo+NexT(四):Hexo站点及Next主题配置详解
采用Hexo及NexT搭建好网站以后,有些效果不是我们需要的,Hexo及NexT提供了强大的定制功能,本文章将要讲解的就是如何在对网站进行配置及调整,达到博主需要的效果. 本文章配置环境是Hexo 3 ...
- 关于C# 异步
关于C# 异步操作整理 按照个人的理解, 写一个接口用Task异步操作(态度:接受并且学习,您提出宝贵的经验与理解,我会认真学习): 在主线程中调用异步方法,如果主线程依赖异步方法的返回值那么你一定会 ...