UESTC_我要长高 CDOJ 594

韩父有N个儿子,分别是韩一,韩二…韩N。由于韩家演技功底深厚,加上他们间的密切配合,演出获得了巨大成功,票房甚至高达2000万。舟子是名很有威望的公知,可是他表面上两袖清风实则内心阴暗,看到韩家红红火火,嫉妒心遂起,便发微薄调侃韩二们站成一列时身高参差不齐。由于舟子的影响力,随口一句便会造成韩家的巨大损失,具体亏损是这样计算的,韩一,韩二…韩N站成一排,损失即为C×(韩i与韩i+1的高度差(1≤i<N))之和,搞不好连女儿都赔了.韩父苦苦思索,决定给韩子们内增高(注意韩子们变矮是不科学的只能增高或什么也不做),增高1cm是很容易的,可是增高10cm花费就很大了,对任意韩i,增高Hcm的花费是H2.请你帮助韩父让韩家损失最小。

Input

有若干组数据,一直处理到文件结束。

每组数据第一行为两个整数:韩子数量N(1≤N≤50000)和舟子系数C(1≤C≤100)

接下来N行分别是韩i的高度(1≤hi≤100)。

Output

对每组测试数据用一行输出韩家的最小损失。

Sample input and output

Sample Input Sample Output
5 2
2
3
5
1
4
15

解题报告

用单调队列来优化(正解)...空间复杂度也可以优化到O(100*2)...好吧我又没有优化

当时先用的线段树来O(log)得到最优解,结果本机测试跑极限数据1.5s+才出。。。果断放弃(常数太大)

之后采用rmq...交了一发TLE,彻底断了我的念头...

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
typedef long long ll;
using namespace std;
const int maxn = 5e4 + 500;
int n,c,h[maxn];
ll  q[105];
ll  f[maxn][105];
ll  MAX;

int main(int argc,char *argv[])
{
  MAX = 1 << 25;
  MAX *= MAX;
  while(scanf("%d%d",&n,&c) != EOF)
   {
         for(int i = 1 ; i <= n ; ++ i)
          scanf("%d",h+i);
         for(int i = 1 ; i <= n ; ++ i)
          for(int j = 1 ; j <= 100 ; ++ j)
           f[i][j] = MAX;
         for(int i = h[1] ; i <= 100 ; ++ i)
           f[1][i] = (i-h[1])*(i-h[1]);
         int front , rear ;
         for(int i = 2 ; i <= n ; ++ i)
          {
                front = rear = 0;
                for(int j = h[i-1] ; j <= 100 ; ++ j)
                 {
                       while(front < rear && f[i-1][q[rear-1]]-c*q[rear-1] > f[i-1][j]-c*j)
                          rear--;
                       q[rear++] = j;
           }
          for(int j = h[i] ; j <= 100 ; ++ j)
            if (j >= q[front])
                 f[i][j] = f[i-1][q[front]] - c*q[front] + c*j + (j-h[i])*(j-h[i]);
          front = rear = 0;
          for(int j = h[i-1] ; j <= 100 ; ++ j)
           {
                 while(front < rear && f[i-1][q[rear-1]]+c*q[rear-1] > f[i-1][j]+c*j )
                  rear--;
                 q[rear++] = j;
           }
          for(int j = h[i] ; j <= 100 ; ++ j)
           {
                 while(j > q[front] && front < rear)
                  front++;
                 if (q[front] >= j)
                  f[i][j] = min(f[i][j],f[i-1][q[front]] + c*q[front] - c*j + (j-h[i])*(j-h[i]));
           }
       }
      ll ans = f[n][h[n]];
      for(int j = h[n] ; j <= 100 ; ++ j)
       ans = min(ans,f[n][j]);
      printf("%lld\n",ans);
   }
  return 0;
}
时间: 2024-10-13 22:37:21

UESTC_我要长高 CDOJ 594的相关文章

[UESTC 594] 我要长高

题目链接: 我要长高 题目分析: 设\(dp[i][j]\)表示到第\(i\)个人,他的身高是\(j\)的时候的最小损失,然后得到一个朴素的转移方程 \(dp[i][j] = min(dp[i - 1][k] + abs(k - j) * C + (j - a[i]) ^ 2)\) 把无关的丢到\(min\)外面来 \[ dp[i][j] = \left\{ \begin{aligned} min(dp[i - 1][k] + k * C) - j * C + (j - a[i]) ^ 2 (j

【美容护肤】美白,瘦身,长高,去痘,去斑,太全啦!

[美白] 用手捧一把的大米 淘一遍的水倒掉 要第二遍的水 淘米水呈弱碱性 皮肤也是 所以对皮肤真的是非常好 然后把大米倒进一个小锅里面 倒大约2小碗水 煮大约30分钟左右 直到大米变的很粘稠为止 先用淘米水把面部清洁干净 之后把粘稠的煮熟的大米抹在脸上 你会发现皮肤摸起来滑滑的 很滋润 大约15分钟左右洗掉脸上的大米 照一下镜子 镜子里面的自己是不是白了很多呢? [去黑头] 黑头真的是很让人烦恼的呢 主要是毛孔堵塞垃圾出不来的原因 大热天儿的 汗从堵塞的毛孔排不出来真的很让人恼火的呢 用苏打粉吧

怎样才能长高 让孩子快速长高的好方法

现在的家长朋友们除了关心孩子的身体健康以外,最关心的就是孩子的身高问题,但是有什么好的方法可以让孩子的身体长高呢?这是每位家长都关心的问题.有关专家提醒家长朋友们,想要让孩子随意的玩耍是可以的,但是一定要给孩子制定一套系统的运动方式,这样才更有利于孩子的成长,因为在平时的活动或者是运动的时候,使用的肌肉群是不一样的,而且每天的运动时间最好是保证在半个小时以上,因为生长激素在开始运动30分钟后分泌最旺盛. 运动是快乐的游戏而不是义务性的活动 大部分孩子都会散漫.集中力差,所以只要觉得不好玩了就会马

UESTC 594 我要长高 dp单调队列优化入门

//其实是个伪单调队列...渣渣刚入门 //戳这里:594 //dp[ i ][ j(现身高) ] = min(    dp[ i ][ k(现身高) ]  + fabs( j(现身高) - k(现身高) ) * C + ( j(现身高) - h[i](原身高) )  *( j(现身高) - h[i](原身高) )     ); 观察到可以单调队列优化,O(N * H * H)  —>  O(N * H) j >= k 时, dp[ i ][ j ] = min (    dp[ i ][ k

【单调队列优化dp】uestc 594 我要长高

http://acm.uestc.edu.cn/#/problem/show/594 [AC] 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn=5e4+2; 5 const int inf=0x3f3f3f3f; 6 int n,c; 7 int cur; 8 int dp[2][maxn]; 9 int q[maxn]; 10 int main() 11 { 1

UESTC 594 我要长高 - 单调性优化

韩父有N个儿子,分别是韩一,韩二…韩N.由于韩家演技功底深厚,加上他们间的密切配合,演出获得了巨大成功,票房甚至高达2000万.舟子是名很有威望的公知,可是他表面上两袖清风实则内心阴暗,看到韩家红红火火,嫉妒心遂起,便发微薄调侃韩二们站成一列时身高参差不齐.由于舟子的影响力,随口一句便会造成韩家的巨大损失,具体亏损是这样计算的,韩一,韩二…韩N站成一排,损失即为C×(韩i与韩i+1的高度差(1≤i<N))之和,搞不好连女儿都赔了.韩父苦苦思索,决定给韩子们内增高(注意韩子们变矮是不科学的只能增高

UESTC_方老师分身 I CDOJ 914

方老师分身 I Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 方老师为了开更多讲座,于是他分身了!早上他都在某一个教室分身,然后各个分身分别赶去各个不同的n个教室(当然每个教室都要有且只有一个分身).晚上各个分身都赶回之前分身时的教室,合并成一个人(不需要同时回去).但是教室间的路十分崎岖,而且是单向的.当然即便只是方老师的分身,那也是相当厉害的,

如何长高

在骨骼生長板關起來之前,如何掌握長高密碼?天天吃鈣片有用嗎?轉骨方要怎麼喝? 很多父母期望自己的孩子高人一等,在人群中能鶴立雞群,而不是被淹沒.明白攸關生長的重要知識,才能有效幫助孩子長高,並避免不切實際的過度期待. 人類有二個快速生長的黃金期:嬰兒期及青春期(女生平均每年長高8-10公分,男生10-12公分).在骨骼的生長板還未關閉前,是最後的長高機會,需要好好掌握. 林口長庚醫院兒童內分泌科主治醫師羅福松引述美國史丹佛大學Greulich及Pyle教授在<手與手腕骨骼發展之影像解剖學(Rad

UESTC_方老师买表 CDOJ 885

老师买表 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 由于方老师出色的专题讲座,他的名气迅速扩散到全国各地,并通过各地的讲座赚到了很多钱,鉴于现在盛行买表,于是方老师带上了一个H×W的盒子去买表,我们假设每一个表占1×2或者2×1的空间,问方老师有多少种放置表的方式,把这个盒子填满. Input 输入有多组数据 每组数据占一行,每一行有2个正整数