题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3045

It’s summer vocation now. After tedious milking, cows are tired and wish to take a holiday. So Farmer Carolina considers having a picnic beside the river. But there is a problem, not all the cows consider it’s a good idea! Some cows like to swim in West Lake, some prefer to have a dinner in Shangri-la ,and others want to do something different. But in order to manage expediently, Carolina coerces all cows to have a picnic! 
Farmer Carolina takes her N (1<N≤400000) cows to the destination, but she finds every cow’s degree of interest in this activity is so different that they all loss their interests. So she has to group them to different teams to make sure that every cow can go to a satisfied team. Considering about the security, she demands that there must be no less than T(1<T≤N)cows in every team. As every cow has its own interest degree of this picnic, we measure this interest degree’s unit as “Moo~”. Cows in the same team should reduce their Moo~ to the one who has the lowest Moo~ in this team——It’s not a democratical action! So Carolina wishes to minimize the TOTAL reduced Moo~s and groups N cows into several teams. 
For example, Carolina has 7 cows to picnic and their Moo~ are ‘8 5 6 2 1 7 6’ and at least 3 cows in every team. So the best solution is that cow No.2,4,5 in a team (reduce (2-1)+(5-1) Moo~)and cow No.1,3,6,7 in a team (reduce ((7-6)+(8-6)) Moo~),the answer is 8. 

Input

The input contains multiple cases. 
For each test case, the first line has two integer N, T indicates the number of cows and amount of Safe-base line. 
Following n numbers, describe the Moo~ of N cows , 1st is cow 1 , 2nd is cow 2, and so on. 
Output

One line for each test case, containing one integer means the minimum of the TOTAL reduced Moo~s to group N cows to several teams.

Sample Input

7 3
8 5 6 2 1 7 6

Sample Output

8

题意:

现有N只奶牛,每只奶牛都有一个Moo[i]值,代表它对野餐的感兴趣程度;

现在要给奶牛们分成若干组,限定每组至少有t只奶牛;

每一组的奶牛的Moo值都会减少为其所在组的奶牛们中最小的Moo值。

题解:

首先对N只奶牛按照Moo值从小到大排序一下,重新编号为1~N;

设dp[i]代表前i项的minimize the TOTAL reduced Moo~s;

设sum[i]是Moo[]的前缀和数组;

则状态转移方程为dp[i] = min{ dp[j] + ( sum[i] - sum[j] ) - Moo[j+1] * ( i - j ) },t ≤ j ≤ i - t;

可以看出要完成全部状态转移,是O(n2)的时间复杂度,N≤400000的范围,显然是要超时的,上斜率优化。

在计算dp[i]时,对于j的可能取值,假设有a,b,满足t ≤ a < b ≤ i - t,

若有dp[b] + ( sum[i] - sum[b] ) - Moo[b+1] * ( i - b ) ≤ dp[a] + ( sum[i] - sum[a] ) - Moo[a+1] * ( i - a )

则可以说b点优于a点;

对上式进行变形可得:

我们不妨设

那么就有:

b点优于a点 <=> g(a,b) ≤ i

b点劣于a点 <=> g(a,b) > i

于是进一步的,就有:

在计算dp[i]时,对于j的可能取值,假设有a,b,c,满足t ≤ a < b < c ≤ i - t,

若g(a,b) ≥ g(b,c),则b点必然淘汰。

证明:若g(b,c) ≤ i,则c点优于b点;若g(b,c) > i,则g(a,b) ≥ g(b,c) > i,则b点劣于a点;不管如何,b点都被淘汰。

再然后就是按照上面的性质,维护一个下凸的图形,斜率逐渐增大。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=+; int n,t;
LL Moo[maxn],sum[maxn];
LL dp[maxn];
int q[maxn],head,tail; LL up(int a,int b)
{
return (dp[b]-sum[b]+Moo[b+]*b)-(dp[a]-sum[a]+Moo[a+]*a);
}
LL down(int a,int b)
{
return Moo[b+]-Moo[a+];
} int main()
{
while(scanf("%d%d",&n,&t)!=EOF)
{
for(int i=;i<=n;i++) scanf("%I64d",&Moo[i]);
sort(Moo+,Moo+n+);
sum[]=;
for(int i=;i<=n;i++) sum[i]=sum[i-]+Moo[i]; head=tail=;
dp[]=;
for(int i=;i<=min(*t-,n);i++) dp[i]=dp[i-]+Moo[i]-Moo[]; for(int i=*t;i<=n;i++)
{
int j=i-t;
while(head+<tail)
{
int a=q[tail-], b=q[tail-];
if(up(a,b)*down(b,j)>=up(b,j)*down(a,b)) tail--;
else break;
}
q[tail++]=j; while(head+<tail)
{
int a=q[head], b=q[head+];
if(up(a,b)<=i*down(a,b)) head++;
else break;
}
j=q[head];
dp[i]=dp[j]+(sum[i]-sum[j])-Moo[j+]*(i-j);
} printf("%I64d\n",dp[n]);
}
}

注意,本题Moo[i]没有明确说明范围,所以用int就爆掉了,要用long long,并且也不能直接g=up/down然后去比较g(),只能化成乘法形式。

HDU 3045 - Picnic Cows - [斜率DP]的更多相关文章

  1. hdu 3045 Picnic Cows(斜率优化DP)

    题目链接:hdu 3045 Picnic Cows 题意: 有n个奶牛分别有对应的兴趣值,现在对奶牛分组,每组成员不少于t, 在每组中所有的成员兴趣值要减少到一致,问总共最少需要减少的兴趣值是多少. ...

  2. HDU 3045 Picnic Cows(斜率优化DP)

    Picnic Cows Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  3. HDU 3045 picnic cows(斜率DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3045 题目大意:有n个数,可以把n个数分成若干组,每组不得小于m个数,每组的价值=除了该组最小值以外每 ...

  4. 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]$为答案. 然后斜率优化就可以 ...

  5. HDU3045 Picnic Cows —— 斜率优化DP

    题目链接:https://vjudge.net/problem/HDU-3045 Picnic Cows Time Limit: 8000/4000 MS (Java/Others)    Memor ...

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

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

  8. HDU 3480 Division(斜率DP裸题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3480 题目大意:将n个数字分成m段,每段价值为(该段最大值-该段最小值)^2,求最小的总价值. 解题思 ...

  9. [kuangbin带你飞]专题二十 斜率DP

            ID Origin Title   20 / 60 Problem A HDU 3507 Print Article   13 / 19 Problem B HDU 2829 Lawr ...

随机推荐

  1. 关于UIGestureRecognizerState

    UIGestureRecognizerState的定义如下 typedef enum { UIGestureRecognizerStatePossible, UIGestureRecognizerSt ...

  2. 8 -- 深入使用Spring -- 3... 资源访问

    8.3 资源访问 Spring 为资源访问提供了一个Resource接口,Spring框架本身大量使用了Resource来访问底层资源. Resource 本身是一个接口,是具体资源访问策略的抽象,也 ...

  3. spring+hibernate 下载

    http://www.cnblogs.com/haogj/archive/2012/07/28/nhibernate.html-------原文 http://www.springframework. ...

  4. ios开发之--实现TextView提示文字并且输入字数限制

    实现字数控制和限制,并展示当前输入的字符串长度,以及按钮的点击状态,代码如下: 1,设置代理 @interface FKViewController ()<UITextViewDelegate& ...

  5. Android中的安全与访问权限控制

    Android是一个多进程系统,在这个系统中,应用程序(或者系统的部分)会在自己的进程中运行.系统和应用之间的安全性是通过Linux的facilities(工具,功能)在进程级别来强制实现的,比如会给 ...

  6. 在 Ubuntu 中安装 MySQL 指南

    安装MySQL 在Ubuntu上可以使用Ubuntu Software Center或者apt命令来安装MySQL,两种方式都十分方便. 1. 使用Ubuntu Software Center:打开U ...

  7. 如何让移植的嵌入式ARM显示中文汉字

    如果你急于在ARM开发板上看到Qt显示中文,而不介意稍次的效果,可以在运行Qt程序时,增加设置字体的参数,比如运行名为hello的Qt程序:./hello -fn unifont 1.首先,需要文泉驿 ...

  8. Objective-C官方文档 值和集合

    版权声明:原创作品,谢绝转载!否则将追究法律责任. 尽管Objective-c是一个面向对象的语言,是C语言的超集,这意味着你可以用任何标准的C标量(非对象)像int,float,和char在Obje ...

  9. web应用安全防范(1)—为什么要重视web应用安全漏洞

    现在几乎所有的平台都是依赖于互联网构建核心业务的. 自从XP年代开始windows自带防火墙后,传统的缓冲器溢出等攻击失去了原有威力,黑客们也把更多的目光放在了WEB方面,直到进入WEB2.0后,WE ...

  10. 原生js--编码请求主体(异步请求)

    1.表单编码请求 需要对每个表单元素进行普通的URL编码,使用“=”把编码后的名字和值分开,并使用“&”分开名值对. 例如:a=b&c=d 表单数据编码的MIME类型:applicat ...