题意:有n个小兵,每个小兵有a【i】血量,第一个人每次只能对一个小兵砍一滴血,第二个人每次对所有生存的小兵砍一滴血。

   最后看第一个人最多可以砍杀几个小兵。

/*
首先,如果所有小兵的血量都不同的话,我们可以杀死所有的小兵,如果所以我们应该尽量使小兵血量不同,
也就是在不能将某个小兵一击致命的情况下,对某个某个血量相同的小兵砍一刀,使其血量不同。
预处理出c[i]表示i血量这个位置上的小兵是由c[i]血量的小兵砍过来的。
dp[i][j]表示进行了i轮之后,留有的砍兵机会为j次的最大值。
dp[i][j]=max(dp[i-1][j-1],dp[i-1][j+c[i]-i])
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 1010
using namespace std;
int c[N],d[N],dp[N][N],s[N],n,m,top,cas;
int main(){
int T;scanf("%d",&T);
while(T--){
m=,top=;
memset(d,,sizeof(d));
memset(c,,sizeof(c));
memset(dp,,sizeof(dp));
scanf("%d",&n);
for(int i=;i<=n;i++){
int x;scanf("%d",&x);
d[x]++;m=max(m,x);
}
for(int i=;i<=m;i++){
if(d[i]==) c[i]=i;
else if(d[i]==) s[++top]=i;
else {
c[i]=i;
while(top&&d[i]>){
int x=s[top];
if(i-x<=top){
top--;
c[x]=i;
d[i]--;
}
else break;
}
}
}
for(int i=;i<=m;i++)
for(int j=;j<=i;j++){
if(j) dp[i][j]=dp[i-][j-];
if(c[i]&&j+c[i]-i<i) dp[i][j]=max(dp[i][j],dp[i-][j+c[i]-i]+);
}
int ans=;
for(int i=;i<=m;i++)
ans=max(ans,dp[m][i]);
printf("Case #%d: %d\n",++cas,ans);
}
return ;
}

最新文章

  1. overlay-1
  2. 全键盘Vimium快捷键学习记录
  3. RPM常用组合【转载】
  4. poj 1568 Find the Winning Move 极大极小搜索
  5. feof使用注意
  6. (转载)OC学习篇之---类的三大特性:封装,继承,多态
  7. 第二百六十五天 how can I 坚持
  8. matlab vs python
  9. NSObject中的isa到底是个什么?
  10. java 二叉搜索树
  11. hexo 适合前端 geek 的博客
  12. cocoaPods教程
  13. 一个用 js 实现点阵图的编辑器演示
  14. 一步一步学Vue(二)
  15. 如何向微软 Docs 和本地化社区提交翻译贡献
  16. Why does Delphi XE7 IDE hangs and fails on out of memory exception?
  17. mysql Mac终端操作
  18. luogu P1776 宝物筛选_NOI导刊2010提高(02)
  19. create-react-app 知识点
  20. js 数组对象的操作方法

热门文章

  1. scrapy--BeautifulSoup
  2. php-语言参考-基本语法3.1
  3. 生产-消费模式的synchronized和lock实现(十)
  4. 【Kaggle】泰坦尼克号
  5. 移动端的拖拽排序在react中实现 了解一下
  6. 7,Flask 中路由系统
  7. 14,vue+uwsgi+nginx部署路飞学城
  8. 一道关于C++ 继承/虚函数 笔试题 [转]
  9. 【Neural Network】林轩田机器学习技法
  10. 珍藏版 Python 开发工程师面试试题