题意:

  给定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的更多相关文章

  1. HDU 4974 A simple water problem(贪心)

    HDU 4974 A simple water problem pid=4974" target="_blank" style="">题目链接 ...

  2. hdu4976 A simple greedy problem. (贪心+DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=4976 2014 Multi-University Training Contest 10 1006 A simp ...

  3. hdu4976 A simple greedy problem.

    A simple greedy problem. Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java ...

  4. hdu 1257 最少拦截系统【贪心 || DP——LIS】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  5. HDU 4978 A simple probability problem

    A simple probability problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  6. 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 ...

  7. hdu 1757 A Simple Math Problem (乘法矩阵)

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  8. HDU 1757 A Simple Math Problem (矩阵快速幂)

    题目 A Simple Math Problem 解析 矩阵快速幂模板题 构造矩阵 \[\begin{bmatrix}a_0&a_1&a_2&a_3&a_4&a ...

  9. HDU 1757 A Simple Math Problem(矩阵)

    A Simple Math Problem [题目链接]A Simple Math Problem [题目类型]矩阵快速幂 &题解: 这是一个模板题,也算是入门了吧. 推荐一个博客:点这里 跟 ...

随机推荐

  1. 如何在SQLServer中处理每天四亿三千万记录的

    项目背景 这是给某数据中心做的一个项目,项目难度之大令人发指,这个项目真正的让我感觉到了,商场如战场,而我只是其中的一个小兵,太多的战术,太多的高层之间的较量,太多的内幕了.具体这个项目的情况,我有空 ...

  2. 【原创】Unable to read TLD "META-INF/c.tld" from JAR file 解决方法

    type Exception report message description The server encountered an internal error () that prevented ...

  3. STM8S103之GPIO

    如何快速了解GPIO,查看Reference manual中GPIO章节,初步了解到GPIO GPIO输入分为:Floating Input和Input with pull-up GPIO输出分为:O ...

  4. c语言中,常见数据类型的字节数

    一直记不住这个,特意mark下来 和机器字长及编译器有关系: 所以,int,long int,short int的宽度都可能随编译器而异.但有几条铁定的原则(ANSI/ISO制订的):  1 size ...

  5. swift语言点评十七-Designated Initializers and Convenience Initializers

    Swift defines two kinds of initializers for class types to help ensure all stored properties receive ...

  6. category和关联对象

    如上所见,我们知道在category里面是无法为category添加实例变量的.但是我们很多时候需要在category中添加和对象关联的值,这个时候可以求助关联对象来实现. MyClass+Categ ...

  7. 玩转图片上传————原生js XMLHttpRequest 结合FormData对象实现的图片上传

    var form=document.getElementById("formId"); var formData=new FormData(form); var oReq = ne ...

  8. express + jqPaginator 分页展示内容

    写在前面的话 分页展示内容也是我们在页面开发中经常会遇到的需求 前端页面利用jqPaginator这个jquery插件来编写 后端利用mysql存储数据 开始敲代码 回顾sql知识 首先让我们回顾一下 ...

  9. js判断浏览器的环境(pc端,移动端,还是微信浏览器)

    window.navigator.userAgent用来区分设备和浏览器 <!DOCTYPE html> <html> <head> <meta charse ...

  10. luogu P1869 愚蠢的组合数(质因数+瞎搞)

    题意 n<=105 题解 一个数是不是偶数就是看有没有二这个质因子. 所以我们先预处理每个数的阶乘的二这个质因子的数量 然后按公式判断就行了. #include<iostream> ...