HDU 4976 A simple greedy problem. 贪心+DP
题意:
给定n<=1000个小兵,A每次都能使小兵掉1点血,B每次能使所有小兵掉1点血,A、B轮流攻击,每次轮到A他会选择是否攻击,轮到B必须攻击。求A最多能杀死多少小兵。(当小兵血量为1时被攻击到视为被杀死)
思路:
如果所有小兵血量都不一样,A必定能杀死所有小兵。如果有小兵血量相同,那么A必定会攻击一些小兵使他们血量不同。所以我们可以把A的攻击分为两类:用来刚好杀死小兵的一次, 和用来使小兵血量不同的攻击。
我们可以用贪心的思想预处理出怎样用最小的攻击次数让小兵的血量都不同。
然后我们可以用DP[i][j]表示在B第 i 次攻击的时候A攻击了 j 次时,A能杀死的最多小兵数量。这样,A没有攻击的次数,可以留到后面,让后面的小兵血量变得不同。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <functional>
#include <cctype>
#include <time.h> using namespace std; const int INF = <<;
const int MAXN = ; int a[MAXN];
int b[MAXN];
int dp[MAXN];
int n, MAX; void solve() {
scanf("%d", &n);
for (int i = ; i < n; i++) scanf("%d", &a[i]);
sort(a, a+n);
memset(b, , sizeof(b));
for (int i = ; i < n; i++)
for (int j = a[i]; j > ; j--)
if (!b[j]) {
b[j] = a[i];
break;
}
memset(dp, , sizeof(dp));
for (int i = ; i <= a[n-]; i++) if (b[i]>) {
for (int j = i; j >= b[i]-i+; j--) {
dp[j] = max(dp[j], dp[j-b[i]+i-]+);
}
}
int ans = ;
for (int i = ; i <= a[n-]; i++)
ans = max(ans, dp[i]);
printf("%d\n", ans);
} int main() {
#ifdef Phantom01
freopen("HDU4976.txt", "r", stdin);
#endif //Phantom01 int T;
scanf("%d", &T);
for (int i = ; i <= T; i++) {
printf("Case #%d: ", i);
solve();
} return ;
}
HDU 4976 A simple greedy problem. 贪心+DP的更多相关文章
- HDU 4974 A simple water problem(贪心)
HDU 4974 A simple water problem pid=4974" target="_blank" style="">题目链接 ...
- hdu4976 A simple greedy problem. (贪心+DP)
http://acm.hdu.edu.cn/showproblem.php?pid=4976 2014 Multi-University Training Contest 10 1006 A simp ...
- hdu4976 A simple greedy problem.
A simple greedy problem. Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java ...
- hdu 1257 最少拦截系统【贪心 || DP——LIS】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- HDU 4978 A simple probability problem
A simple probability problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- HDU 1757 A Simple Math Problem 【矩阵经典7 构造矩阵递推式】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=1757 A Simple Math Problem Time Limit: 3000/1000 MS (J ...
- hdu 1757 A Simple Math Problem (乘法矩阵)
A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- HDU 1757 A Simple Math Problem (矩阵快速幂)
题目 A Simple Math Problem 解析 矩阵快速幂模板题 构造矩阵 \[\begin{bmatrix}a_0&a_1&a_2&a_3&a_4&a ...
- HDU 1757 A Simple Math Problem(矩阵)
A Simple Math Problem [题目链接]A Simple Math Problem [题目类型]矩阵快速幂 &题解: 这是一个模板题,也算是入门了吧. 推荐一个博客:点这里 跟 ...
随机推荐
- Android封装类似微信的顶部TitleBar弹出的PopupWindow代码
Android仿微信顶部titlebar,点击加号弹出的PopupWindow,是封装好的PopupWindow,直接拿来用即可,先看效果图: 调用代码非常简单,这是MainActivity的代码: ...
- MySQL学习(二)——SQL语句创建删除修改以及中文乱码问题
一.对数据库的操作 1.创建一个库 create database 库名; 创建带有编码的:create database 库名 character set 编码; 查看编码:show create ...
- java中class,public的用法
java中class,public的用法 一.Java访问权限饰词(access specifiers) Java有public.protect.friendly.private四种访问权限,并且这四 ...
- 监控慢SQL
SELECT G.TARGET || ' ' || S.MACHINE || ' ' || ceil((G.LAST_UPDATE_TIME - G.START_TIME)*86400) FROM ...
- SpringBoot学习笔记(4)----SpringBoot中freemarker、thymeleaf的使用
1. freemarker引擎的使用 如果你使用的是idea或者eclipse中安装了sts插件,那么在新建项目时就可以直接指定试图模板 如图: 勾选freeMarker,此时springboot项目 ...
- 洛谷P3254 圆桌问题 网络流_二分图
Code: #include<cstdio> #include<algorithm> #include<vector> #include<queue> ...
- 将对象a的属性赋值给对象b
BeanUtils.copyProperties(a,b); 将a的属性赋值给b(ab的共同属性)
- SASS 使用(vs code)
二.在vs code中编译sass 1.在拓展商店里搜索“easy sass”,并安装,安装成功后点重新加载. 2.接下来进行配置: 在 vs code 菜单栏依次点击“文件 首选项 设置”,打开 s ...
- HDU-5685 Problem A 求乘法逆元
题目链接:https://cn.vjudge.net/problem/HDU-5685 题意 给一个字符串S和一个哈希算法 $ H(s)=\prod_{i=1}^{i\leq len(s)}(S_{i ...
- [NOIP2003提高组]侦探推理
题目:洛谷P1039.Vijos P1106.codevs1089. 题目大意:给你一系列证词,要你求出谁是凶手.具体题目见原题. 解题思路:我们枚举犯人和星期,一个一个进行判断.如果成功则记录答案, ...