LINK

首先枚举每一个随从ppp作为被控制的随从,这部分复杂度为O(100)O(100)O(100)

然后用ppp打死其他随从需要的血量是固定的,获得的价值就是其他随从的攻击力

看起来可以做个背包,但是当ppp快死亡时的最后一击,即使之还剩111滴血也可以发起最后一击

显然需要枚举最后一次攻击打死哪个随从,这部分复杂度为O(100)O(100)O(100)

再套一个背包复杂度就太高了,但是我们可以提前预处理

处理f1[i][j]f1[i][j]f1[i][j]表示在[1,i][1,i][1,i]个随从花费血量jjj干掉的最大攻击力
处理f2[i][j]f2[i][j]f2[i][j]表示在[i,n][i,n][i,n]个随从花费血量jjj干掉的最大攻击力

那么当ppp作为被控制随从,iii作为ppp最后一个攻击的随从时

我们枚举[1,i−1][1,i-1][1,i−1]花费血量jjj能得到的最大收益,最后一次打死随从iii花费血量huahuahua

那么此时的最大收益就是f1[i−1][j]+f2[i+1][yid−j−hua]+xi+xidf1[i-1][j]+f2[i+1][y_{id}-j-hua]+x_i+x_{id}f1[i−1][j]+f2[i+1][yid​−j−hua]+xi​+xid​

需要注意的是,可能会存在ppp把所有其他随从全都打死自己还活着的情况,此时就不应该计算xidx_{id}xid​的贡献

#include <bits/stdc++.h>
using namespace std;
int x[109],y[109],f1[109][10009],f2[109][10009];
int n,ans,sum;
void initDP(int id)
{/*f1[i][j]表示前i个随从花费血量j干掉的最大攻击力f2[i][j]表示[i,n]花费j血量干掉的最大攻击力 */for(int i=1;i<=n;i++)for(int j=0;j<=10000;j++)f1[i][j] = f2[i][j] = 0;for(int i=1;i<=n;i++)for(int j=0;j<=10000;j++){f1[i][j] = f1[i-1][j];if( i==id )   continue;int val = x[i]*( (y[i]-1)/x[id]+1 );if( j>=val ) f1[i][j] = max( f1[i][j],f1[i-1][j-val]+x[i] );}for(int i=n;i>=1;i--)for(int j=0;j<=10000;j++){f2[i][j] = f2[i+1][j];if( i==id )  continue;int val = x[i]*( (y[i]-1)/x[id]+1 );if( j>=val ) f2[i][j] = max( f2[i][j],f2[i+1][j-val]+x[i] );}
}
void solve(int id)//id作为攻击者
{initDP( id );int pre = 0;for(int i=1;i<=n;i++) pre += x[i]*( (y[i]-1)/x[id]+1 );pre -= x[id]*( (y[id]-1)/x[id]+1 );for(int i=1;i<=n;i++)//最后一次撞的是i {if( i==id )  continue;int hua = x[i]*( (y[i]-1)/x[id] )+1;//干掉i最少需要的血量int now = pre-x[i]*( (y[i]-1)/x[id]+1 )+hua; for(int j=0;j<=y[id]-hua;j++)//枚举前i-1个花费j血量得到的最大收益 {if( now<y[id] )ans = min( ans, sum-f1[i-1][j]-f2[i+1][y[id]-j-hua]-x[i] );elseans = min( ans, sum-f1[i-1][j]-f2[i+1][y[id]-j-hua]-x[i]-x[id] );//如果要让第id个随从直接死掉,同样枚举前i-1个花费血量j, }}
}
int main()
{cin >> n;for(int i=1;i<=n;i++)    cin >> x[i] >> y[i], sum += x[i];if( n==1 ){ cout << 0; return 0; }ans = 1e18;for(int i=1;i<=n;i++)   solve( i );//枚举点i作为攻击者 cout << ans;
}

The 9-th BIT Campus Programming F. 狂乱(背包)相关推荐

  1. 2016 UESTC Training for Dynamic Programming F - 柱爷与三叉戟不得不说的故事 压位dp

    F - 柱爷与三叉戟不得不说的故事 Time Limit: 500/500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) ...

  2. Gym102174 (The 14-th BIT Campus Programming Contest)

    传送门: Problem A 温暖的签到题,用个map记录一下就行了. #include <bits/stdc++.h> using namespace std; string str[2 ...

  3. The 14-th BIT Campus Programming Contest(部分题解)

    A. 两只脑斧 time limit per test1.0 s memory limit per test256 MB inputstandard input outputstandard outp ...

  4. ZOJ 3703 Happy Programming Contest 0-1背包 DP

    ZOJ 3703 Happy Programming Contest 题目描述: 题目链接:ZOJ 3703 Happy Programming Contest 题目大意: 这是一道虐狗的题目.讲的是 ...

  5. AtCoder Beginner Contest 192 F - Potion 背包dp

    传送门 题意: 给你nnn个数,让后让你选出来kkk个AAA,把他们求和,之后再递增kkk直到正好达到xxx,求最小的递增次数. 思路: 转化一下题意就是求∑A=x(modlen)\sum A=x(\ ...

  6. ap drawing 课件_ILITEK TP AP introduction.ppt

    ILITEK TP AP introduction Drawing Direction – module test Button L/R Sensor test AP Condition Condit ...

  7. Python:第10章文件操作 课后习题

    <Python语言程序设计>刘卫国主编,中国工信出版集团,电子工业出版社 习题10 一.选择题 1.在读写文件之前,用于创建文件对象的函数是(      ).A A.open        ...

  8. IT类英文电子书存档页面

    为什么80%的码农都做不了架构师?>>>    http://www.salttiger.com/archives/ 目前我主要在以下两个网站收集编程类的电子书,在这上面找不到的书, ...

  9. C的动态优化 约瑟夫环

    动态规划 代码 #include <stdio.h>package(int *w,int *v,int n,int c){int i,j;for(i=1;i<=m;i++){f[i] ...

最新文章

  1. python网页查询然后返回结果_使用pythondjang在html页面上显示查询到的API结果
  2. 大众点评订单分库分表实践之路
  3. python中类怎么理解_Python中的列表理解
  4. mysql 大小写问题
  5. 《Docker技术从入门到实践》第1,2章
  6. Ubuntu 16.04 安装 CUDA10.1 (解决循环登陆的问题)
  7. PHP 数据库中的模糊查询
  8. 语言编奇数和合偶数和_Go语言基础(三)
  9. 卡巴斯基KEY文件的类型选择
  10. 【2022-01-06】JS逆向之QCC请求头参数
  11. 国内外优秀呼叫中心系统简介
  12. python不合法的布尔表达式,python笔试题22-41
  13. MYSQL 金额转大写中文
  14. 滴水逆向三期笔记与作业——02C语言——02数据类型
  15. (二)51单片机基础——LED
  16. 细数 GameFi 模型发展 ,未来仍可期?
  17. 使用Anaconda创建新环境下载速度过慢导致失败
  18. 赛门铁克:与神州云科合作达成两大目标
  19. 每日算法面试题,大厂特训二十八天——第九天(位运算)
  20. 洛谷 P2388 阶乘之乘 题解

热门文章

  1. Vue3基础难点总结
  2. 迷宫最短路径问题(数据结构4.4.3 拓展)
  3. Linux如何查看当前Ubuntu系统的版本
  4. 如何判断初级,中级,高级等等不同级别程序员
  5. Ubuntu 怎么创建可视化界面
  6. 高级Spring之Scope 详解
  7. line-height1.5和line-height:150%的区别
  8. python-绘制散点图
  9. git学习——上传项目代码到github
  10. MATLAB数学建模必备算法--层次分析法AHP