HDU 3045 picnic cows(斜率DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3045
题目大意:有n个数,可以把n个数分成若干组,每组不得小于m个数,每组的价值=除了该组最小值以外每个值-最小值之和,求使得所有组的价值之和的最小值。
解题思路:将n个数按从小到大排序,处理前i为前缀和为sum[i],则可得出状态转移方程:dp[i]=min{dp[j]+sum[i]-sum[j+1]-a[j+1]*(i-j-1)}(0<=j<i-m+1),再用斜率DP优化即可。
注意:一定要判断j是否大于等于m,因为至少m才能算一组奶牛,不然会出错。
代码:
- #include<iostream>
- #include<algorithm>
- #include<cstring>
- #include<cstdio>
- using namespace std;
- typedef long long LL;
- const int N=5e5+;
- int head,tail;
- LL sum[N],dp[N],a[N],q[N];;
- LL getUP(int k,int j){
- return dp[j]+a[j+]*(j+)-sum[j+]-dp[k]-a[k+]*(k+)+sum[k+];
- }
- LL getDOWN(int k,int j){
- return a[j+]-a[k+];
- }
- //dp[i]=min{dp[j]+sum[i]-sum[j+1]-a[j+1]*(i-j-1)}
- LL getDP(int i,int j){
- return dp[j]+sum[i]-sum[j+]-a[j+]*(i-j-);
- }
- int main(){
- int n,m;
- while(~scanf("%d %d",&n,&m)){
- memset(dp,0x3f3f3f3f,sizeof(dp));
- for(int i=;i<=n;i++){
- scanf("%lld",&a[i]);
- }
- sort(a+,a++n);
- for(int i=;i<=n;i++){
- sum[i]=sum[i-]+a[i];
- }
- dp[]=;
- head=tail=;
- q[tail++]=;
- for(int i=;i<=n;i++){
- while(head+<tail&&getUP(q[head],q[head+])<=i*getDOWN(q[head],q[head+])){
- head++;
- }
- dp[i]=getDP(i,q[head]);
- int j=i-m+;
- //注意z这个判断,因为状态转移,也就是分组,至少要保证第一组有m头牛。
- if(j<m)
- continue;
- while(head+<tail&&getUP(q[tail-],j)*getDOWN(q[tail-],q[tail-])<=getUP(q[tail-],q[tail-])*getDOWN(q[tail-],j)){
- tail--;
- }
- q[tail++]=j;
- }
- printf("%lld\n",dp[n]);
- }
- return ;
- }
HDU 3045 picnic cows(斜率DP)的更多相关文章
- HDU 3045 - Picnic Cows - [斜率DP]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3045 It’s summer vocation now. After tedious milking, ...
- hdu 3045 Picnic Cows(斜率优化DP)
题目链接:hdu 3045 Picnic Cows 题意: 有n个奶牛分别有对应的兴趣值,现在对奶牛分组,每组成员不少于t, 在每组中所有的成员兴趣值要减少到一致,问总共最少需要减少的兴趣值是多少. ...
- HDU 3045 Picnic Cows(斜率优化DP)
Picnic Cows Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 3045 Picnic Cows
$dp$,斜率优化. 设$dp[i]$表示$1$至$i$位置的最小费用,则$dp[i]=min(dp[j]+s[i]-s[j]-(i-j)*x[j+1])$,$dp[n]$为答案. 然后斜率优化就可以 ...
- HDU3045 Picnic Cows —— 斜率优化DP
题目链接:https://vjudge.net/problem/HDU-3045 Picnic Cows Time Limit: 8000/4000 MS (Java/Others) Memor ...
- HDU 2829 Lawrence (斜率DP)
斜率DP 设dp[i][j]表示前i点,炸掉j条边的最小值.j<i dp[i][j]=min{dp[k][j-1]+cost[k+1][i]} 又由得出cost[1][i]=cost[1][k] ...
- HDU 3507 - Print Article - [斜率DP]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 Zero has an old printer that doesn't work well s ...
- HDU 3480 Division(斜率DP裸题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3480 题目大意:将n个数字分成m段,每段价值为(该段最大值-该段最小值)^2,求最小的总价值. 解题思 ...
- [kuangbin带你飞]专题二十 斜率DP
ID Origin Title 20 / 60 Problem A HDU 3507 Print Article 13 / 19 Problem B HDU 2829 Lawr ...
随机推荐
- BZOJ2821:作诗——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2821 问题描述 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好 ...
- BZOJ3932:[CQOI2015]任务查询系统——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3932 题面源于洛谷 题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成 ...
- React Patterns
Contents Stateless function JSX spread attributes Destructuring arguments Conditional rendering Chil ...
- [BZOJ3523][Poi2014]KLO-Bricks——全网唯一 一篇O(n)题解+bzoj最优解
Description 有n种颜色的砖块,第i种颜色的砖块有a[i]个,你需要把他们放成一排,使得相邻两个砖块的颜色不相同,限定第一个砖块的颜色是start,最后一个砖块的颜色是end,请构造出一种合 ...
- Ubuntu16.04+Cuda8.0+1080ti+caffe+免OpenCV3.2.0+faster-rCNN教程
一.事先声明:1.Ubuntu版本:Ubuntu使用的是16.04.而不是16.04.1或16.04.2,这三个是有区别的.笔者曾有过这样的经历,Git上一个SLAM地图构建程序在Ubuntu14.0 ...
- HDU1914 稳定婚姻匹配
The Stable Marriage Problem Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (J ...
- AndroidManifest Ambiguity方案原理及代码
1简述 前段时间在bluebox的一份android安全pdf中看到一个AndroidManifest Ambiguity方案.该方案基于android系统解析AXML的一个特点:android在解析 ...
- 一个JAVA题引发的思考
转载自:http://www.cnblogs.com/heshan664754022/archive/2013/03/24/2979495.html 十年半山 今天在论坛闲逛的时候发现了一个很有趣的题 ...
- 挖一挖unsigned int和补码
文章要讨论的是两部分: 1. 原码,反码和补码. 2. short, unsigned short, int, unsigned int, long, unsigned long的表示及转换 1. 原 ...
- HDU 5961 传递 BFS
题意:中文题,就是判断一个竞赛图拆成两个图,判断是否都传递 思路:分别BFS判深度即可,用这种方法注意要进行读入优化. /** @Date : 2016-11-18-20.00 * @Author : ...