K - 摩天轮

Time Limit: 10000/4000MS (Java/Others)     Memory Limit: 262143/262143KB (Java/Others)
Submit Status

一天,冬马被春希和雪菜拉着去一起去游乐园玩。

经过了各种过山车的洗礼后,三人决定去坐摩天轮休息下。

这是一个巨大的摩天轮,每一个车厢能坐任意多的人。现在,等着坐摩天轮的有n个人(包含他们3人),摩天轮还有m个车厢可以坐人。每个人都有自己肥胖程度,出于某些原因,胖子和瘦子坐在同一节车厢就会产生一定的矛盾,这个矛盾的值为(MAX−MIN)2,其中MAX为当前车厢里面最胖的人的肥胖程度,MIN为最廋的那个人的肥胖程度。

爱管闲事的春希当然不希望就因为这点小事而使大家的这趟旅途不愉快,于是他决定帮大家安排怎么坐才能使总的矛盾值最小,希望你能帮他找到这个最小的矛盾值

Input

第一行为两个整数n,m,分别表示人数和车厢数。(3≤n≤10000,1≤m≤5000)

第二行为n个整数,wi表示第i个人的肥胖程度。(0≤wi≤1000000)

Output

每组数据,输出一个整数,为矛盾的最小值。(答案保证小于231)

Sample input and output

Sample Input Sample Output
4 2
4 7 10 1
18

解题思路:

这是一道斜率优化DP的题目.

我们令 f ( i , j ) 表示将前 i 个人分成 j 份所需的最小费用.

F ( i , j ) = min{ F ( u , j -1) + (sum[i] – sum[ u + 1])^2 }

但是这样做的复杂度高达O(N^2*M),对于本题的规模来讲无法承受,我们考虑

K1 < k2 < i ,且 k2 比 k1更优

有式子

F ( k2 , j - 1 ) + sum( k2 ) ^ 2 -  F( k1 , j -1 ) – sum(k1+1) ^ 2

————————————————————— —————————————   < 2 * sum(i)

sum ( k2 ) – sum( k1+1)

显然这是一个斜率的式子.

假设现在 K(k1 – k2) < 2*sum[i] ,那么k1这个点还有价值吗?

我们注意到sum[i]是单调不减的,也就是说,对于之后的i2,i3…..

K(k1 – k2) < 2*sum[i_x] ,也就是说,k1 完全不可能成为某个点的最优解了,是可以舍弃的.

那么如果现在有 K(k1 – k2) >= 2*sum[i]呢,目前显然是选择k1比k2好,我们应不应该舍弃k2呢?答案是不应该,因为随着i的增大,sum[i]是不减的(也就是说,sum[i]可能会增大),此时 K(k1 – k2) < 2*sum[i] 是可能成立的.

综上所述,我们维护一个单调队列即可,只不过这个单调队列剔除 / 加入元素的条件都是和与斜率有关,这样我们可以在O(1)的时间内得到某个点的最优决策点,复杂度成功降到了O(n*m).

代码使用了滚动数组进行优化

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1e4 + ;
int n,m,h[maxn],f[][maxn],cur=,q[maxn]; double slope(int x,int y)
{
if (h[x+] == h[y+])
return 1e233;
return (double)(f[cur^][x] + h[x+]*h[x+] - (f[cur^][y] + h[y+]*h[y+])) / (double)(h[x+] - h[y+]);
} int main(int argc,char *argv[])
{
scanf("%d%d",&n,&m);
for(int i = ; i <= n ; ++ i) scanf("%d",&h[i]);sort(h+,h++n);
for(int i = ; i <= n ; ++ i) f[cur][i] = (h[i]-h[])*(h[i]-h[]);
for(int i = ; i <= m ; ++ i)
{
cur ^= ;
int front = , rear = ;
q[rear++] = ;
for(int j = ; j <= n ; ++ j)
{
while (rear - front > && slope(q[front],q[front+]) <= *h[j])
front++;
f[cur][j] = f[cur^][q[front]] + (h[j] - h[q[front]+])*(h[j] - h[q[front]+]);
while(rear - front > && slope(q[rear-],q[rear-]) >= slope(q[rear-],j))
rear--;
q[rear++] = j;
}
}
printf("%d\n",f[cur][n]);
return ;
}

UESTC_摩天轮 2015 UESTC Training for Dynamic Programming<Problem K>的更多相关文章

  1. UESTC_导弹拦截 2015 UESTC Training for Dynamic Programming<Problem N>

    N - 导弹拦截 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  2. UESTC_最少花费 2015 UESTC Training for Dynamic Programming<Problem D>

    D - 最少花费 Time Limit: 30000/10000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  3. UESTC_酱神寻宝 2015 UESTC Training for Dynamic Programming<Problem O>

    O - 酱神寻宝 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  4. UESTC_酱神的旅行 2015 UESTC Training for Dynamic Programming<Problem M>

    M - 酱神的旅行 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  5. UESTC_菲波拉契数制升级版 2015 UESTC Training for Dynamic Programming<Problem L>

    L - 菲波拉契数制升级版 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Su ...

  6. UESTC_男神的约会 2015 UESTC Training for Dynamic Programming<Problem J>

    J - 男神的约会 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  7. UESTC_邱老师选妹子(二) 2015 UESTC Training for Dynamic Programming<Problem I>

    I - 邱老师选妹子(二) Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Su ...

  8. UESTC_邱老师选妹子 2015 UESTC Training for Dynamic Programming<Problem H>

    H - 邱老师选妹子 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  9. UESTC_邱老师玩游戏 2015 UESTC Training for Dynamic Programming<Problem G>

    G - 邱老师玩游戏 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

随机推荐

  1. mybatis和hibernate对比

    Hibernate是一个数据库表和java对象之间完全映射的框架,java开发人员直接对java对象操作,而不对数据库表进行操作: Mybatis是对SQL语句和java对象进行映射,仍需要开发人员编 ...

  2. 瑞柏匡丞:app商业价值如何体现

    在互联网行业,想要实现商业价值,必须先实现用户价值.这个观点发源自PC统治互联网的时代,如今PC端的用户停留时间下降,用户行为趋于稳定保守,移动端则蒸蒸日上.而PC与移动端的区别之一是,PC端的用户流 ...

  3. 捆绑和缩小(BundleConfig.RegisterBundles) 第五章 : MVC中的使用 | {version}用法

    使用捆绑与 ASP.NET MVC 放缩法 在这一节我们将创建 ASP.NET MVC 项目,审查捆绑和缩小.首先,创建一个新的 ASP.NET MVC 互联网项目,命名为MvcBM ,而无需更改任何 ...

  4. 安全:加固你的ssh 登录

    SSH 是我们控制虚拟主机的一种途径,这个途径可以让我们拥有完全的控制权,如果对于这个控制权没有进行很好的安全处理,那么将会造成很大的安全问题.      我们可以在系统的日志文件 (例如:/var/ ...

  5. hdu 5611 Baby Ming and phone number(模拟)

    Problem Description Baby Ming collected lots of cell phone numbers, and he wants to sell them for mo ...

  6. hdu 5036 Explosion(概率期望+bitset)

    Problem Description Everyone knows Matt enjoys playing games very much. Now, he to N. Input The firs ...

  7. mysql 基础技术

    一.树状结构 参考http://www.cnblogs.com/kingteach/archive/2011/07/05/2098046.html )) begin declare lev int; ...

  8. java与.net比较学习系列(1) 开发环境和常用调试技巧

    最近因为公司项目要由.net平台转到java平台的原因,之前一直用.net的我不得不开始学习java了,刚开始听到说要转java的时候很抗拒,因为我想专注在.net平台上,不过这样也并不完全是坏事,通 ...

  9. AE分级渲染

    分级渲染classbreakrenderer位于carto类库中,进行分级渲染时,首先要将相应图层按照某一Field分级.可使用esrisystem类库中的iclassifyGEN类的classify ...

  10. sqlite3安装

    SQLite命令行程序(CLP)是开始使用SQLite的最好选择,按照如下步骤获取CLP: 1).打开浏览器进入SQLite主页,www.sqlite.org. 2).单击页面顶部的下载链接(Down ...