怪物猎人[贪心+dp]
S o l u t i o n \mathcal{Solution} Solution
设当前砍到了第 2 2 2 个怪物,
则 代价 为 ( a i + d ) ( b i + d ) = a i b i + a i d + d b i + d 2 = a i b i + d ( a i + b i ) + d 2 (a_i+d)(b_i+d)=a_i b_i + a_i d + db_i+d^2=a_ib_i+d(a_i+b_i)+d^2 (ai+d)(bi+d)=aibi+aid+dbi+d2=aibi+d(ai+bi)+d2
发现只有 d ( a i + b i ) d(a_i+b_i) d(ai+bi) 是会变的量, 基于 贪心 思路, 使 ( a i + b i ) (a_i+b_i) (ai+bi) 在 d d d 比较大时尽量小 .
于是按照 a i + b i a_i+b_i ai+bi 从大到小排序 ( 第 一 步 ) \ \ \ \ \ \ \ (第一步) (第一步)
光排序还不够, 还需要进行简单的 d p dp dp,
设 d p [ i , j ] 表 示 前 i 个 砍 j 个 所 需 要 的 最 小 代 价 dp[i, j] 表示前 i个砍j个所需要的最小代价 dp[i,j]表示前i个砍j个所需要的最小代价
d p [ i , j ] = d p [ i − 1 , j − 1 ] + [ a i + ( i − 1 ) d ] ∗ [ b i + ( i − 1 ) d ] dp[i,j]=dp[i-1, j-1]+[a_i+(i-1)d]*[b_i+(i-1)d] dp[i,j]=dp[i−1,j−1]+[ai+(i−1)d]∗[bi+(i−1)d]
得到 d p [ N , 1... N ] dp[N, 1...N] dp[N,1...N] 后 二分查找 即可
C o d e \mathcal{Code} Code
#include<bits/stdc++.h>
#define reg registertypedef long long ll;int read(){char c;int s = 0, flag = 1;while((c=getchar()) && !isdigit(c))if(c == '-'){ flag = -1, c = getchar(); break ; }while(isdigit(c)) s = s*10 + c-'0', c = getchar();return s * flag;
}ll read_l(){char c;ll s = 0, flag = 1;while((c=getchar()) && !isdigit(c))if(c == '-'){ flag = -1, c = getchar(); break ; }while(isdigit(c)) s = s*10 + c-'0', c = getchar();return s * flag;
}const int maxn = 3005;int N;
int M;
int D;ll dp[maxn][maxn];struct Node{ int a, b; } A[maxn];bool cmp(Node x, Node y){ return x.a+x.b > y.a+y.b; }int main(){freopen("hunter.in", "r", stdin);freopen("hunter.out", "w", stdout);N = read();M = read();D = read();for(reg int i = 1; i <= N; i ++) A[i].a = read();for(reg int i = 1; i <= N; i ++) A[i].b = read();std::sort(A+1, A+N+1, cmp);memset(dp, 0x3f, sizeof dp);for(reg int i = 0; i <= N; i ++) dp[i][0] = 0;for(reg int i = 1; i <= N; i ++)for(reg int j = 1; j <= i; j ++)dp[i][j] = std::min(dp[i-1][j], dp[i-1][j-1] + 1ll*(A[i].a+1ll*D*(j-1))*(A[i].b+1ll*D*(j-1)));for(reg int i = 1; i <= M; i ++)printf("%d ", std::lower_bound(dp[N]+1, dp[N]+N+1, read_l())-dp[N]-1);return 0;
}
怪物猎人[贪心+dp]相关推荐
- URAL 1203 Scientific Conference(贪心 || DP)
Scientific Conference 之前一直在刷计算几何,邀请赛连计算几何的毛都买见着,暑假这一段时间就做多校,补多校的题目,刷一下一直薄弱的DP.多校如果有计算几何一定要干掉-.- 题意:给 ...
- Codeforces Round #699 (Div. 2) E.Sorting Books(贪心+DP / 线段树)超高质量题解,看不懂来打我 ~
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 E - Sorting Books 一排书架上有 nnn 本书排成一排,每本书上有一个颜色 aia_i ...
- 【bzoj3174】[Tjoi2013]拯救小矮人 贪心+dp
题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人,我们知道他从脚 ...
- HDU 4001 To Miss Our Children Time(2011年大连网络赛 A 贪心+dp)
开始还觉得是贪心呢... 给你三类积木叫你叠楼房,给你的每个积木包括四个值:长 宽(可以互换) 高 类型d d=0:你只能把它放在地上或者放在 长 宽 小于等于 自己的积木上面 d=1:你只能把 ...
- 【BZOJ4069】【APIO2015】巴厘岛的雕塑 [贪心][DP]
巴厘岛的雕塑 Time Limit: 10 Sec Memory Limit: 64 MB [Submit][Status][Discuss] Description 印尼巴厘岛的公路上有许多的雕塑 ...
- 杭电oj1257最少拦截系统—贪心/dp最大递增子序列
附上题目链接:杭电oj1257 这个题目有动态规划和贪心两种解决方式. 贪心法1: 对于导弹我们知道只可以从大到小的反导,一个系统必须从大到小排列.那么我们就可以选择从最高的那个导弹入手,往右找仅次于 ...
- CF1155D Beautiful Array 贪心,dp
CF115DBeautiful Array 题目大意:给一个有n个元素的a数组,可以选择其中一个区间的所有数都乘上x,也可以不选,求最大子序列和. 如果没有前面的操作,就是只求最大子序列和,我们都知道 ...
- CodeForces - 1481E Sorting Books(贪心+dp)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,每次操作可以将任意一本书放到序列的末尾,问最少需要操作多少次,才能使得相同的数字挨在一起 题目分析:不难看出,对每个位置的数都操作一次,是 ...
- 2020ICPC(小米邀请赛2) - Knapsack(贪心+dp)
题目链接:点击查看 题目大意:给出 n 个物品,每个物品都有体积和价值,现在问容量为 m 的背包最多可以装下多少价值的物品 题目分析:本题正解应该是斜率优化dp,然鹅看了大佬们的博客讲解后,感觉不是自 ...
最新文章
- FJUT OJ 2466 T^T的叛乱计划(组合数学)
- 程序的加载和执行(五)——《x86汇编语言:从实模式到保护模式》读书笔记25
- LeetCode 239. Sliding Window Maximum
- Python入门基础之迭代和列表生成式
- Git和GitHub快速入门
- Java 线程详解(一)线程的基础
- 打开Android Studio报错“Error running ***: Please select Android SDK”
- vSphere 5.5 使用Web Client打开控制台窗口显示连接超时
- 在html css中加粗显示,css字体怎么加粗?
- 第11章 UART串口通信 练习题
- App接入微信登录 步骤
- 蓝桥杯摔手机测试次数
- [cv]郑哲东 Deep-ReID——Learn pedestrian representations from
- android闪光灯测心率,手指放在手机摄像头和闪光灯前检测心率的应用是什么原理?...
- [C#] C#深入浅出4th Edition [2]
- 无法启动此程序,因为计算机中丢失vcruntime140.dll”的解决方法
- 对当下很火的两大短视频平台 抖音 和 微视进行竞品分析
- nodejs+vue旅游网站设计
- 大量的if!=null_获得大量精彩游戏,并支持伟大事业!
- ecshop文件结构