题目描述

听说公主被关押在城堡里,彭大侠下定决心:不管一路上有多少坎坷,不管城堡中的看守有多少厉害,不管救了公主之后公主会不会再被抓走,不管公主是否漂亮、是否会钟情于自己,他将义无反顾地朝着城堡前进。

可是,通往城堡的路上出现了一些情况。抽象地说,假象地图在二维平面的第一象限。在每个横轴的x位置上有一个高为hx的支撑点,如果彭大侠没有跳到支撑点上,那么他就会掉下去,牺牲在路途。

开始时彭大侠在起点(1,h1)处,而城堡的入口在(n,hn)处。彭大侠每次可以从支撑点(x,hx)跳到支撑点(x+1,hx+1)。但是彭大侠每次的跳跃能量只有d,也就是说,每次跳跃必须满足条件|hx+1-hn|<=d。换句话说,如果两个相邻支撑点的纵向落差大于d,那么彭大侠就无法跳跃了!幸运的是,彭大侠还有一个杀手锏。 在起点处,他可以花一个金币,把某个支撑点升高1个单位,或者降低1个单位。但是,起点处和城堡入口处的支撑点高度不能改变,并且一旦离开起点彭大侠就无法使用该杀手锏。

彭大侠被告知100个金币可兑换一单位生命。于是他希望通过少花金币来保存更多单位的生命。

他终于找到了你这位热心的高手,请你帮他规划一下以便耗费尽量少的金币来到达城堡。

输入输出格式

输入格式:

文件第一行包含一个整数m(m<=5),表示问题求解次数。接下来的2m行依次表示每次求解的输入数据块。每个输入数据块占2行,其中第一行包含两个整数n和d,分别表示从起点到城堡入口处必须经过的支撑点数和每次跳跃允许的最大纵向落差,n和d之间用空格隔开,输入数据保证2<=n<=5000,0<=d<=109;第二行包含用空格隔开的n个非负整数h1、h2、...、hn,其中hi(1<=i<=n)表示第i个支撑点的高度,特别地,h1表示彭大侠出发时所在支撑点的高度,hn表示城堡入口所在支撑点的高度,输入数据保证对所有1<=i<=n有0<=hi<=109。

输出格式:

有m行,第I(1<=I<=m)行表示第I次求解时彭大侠到达城堡必须耗费的最少金币数量。若无论怎样使用杀手锏他都无法到达城堡,则输出impossible。输入数据保证答案在int64范围之内。

输入输出样例

输入样例#1:
复制

3
10 2
4 5 10 6 6 9 4 7 9 8
3 1
6 4 0
4 2
3 0 6 3
输出样例#1: 复制

6
impossible
4

说明

对样例中的第一个输入数据块,d=2,把第三个支撑点降低3个单位,把第六个支撑点降低1个单位,把第七个支撑点升高2个单位,原序列变成:4 5 7 6 6 8 6 7 9 8,这时任意相邻支撑点的纵向落差没有超过2,彭大侠可以到达城堡!

对样例中的第二个输入数据块,d=1,这时不管怎样调节第二个支撑点的高度,都无法使任意相邻支撑点的纵向落差不超过1。

对样例中的第三个输入数据块,d=2,这时,把第二个支撑点升高1个单位,把第三个支撑点降低3个单位就满足条件了。

【数据规模】

 20%     n<=100

 40%     n<=1000

100% n<=5000

http://blog.csdn.net/ts124124/article/details/6249475

没有看懂就去上面的网址

首先,把b[i]=a[1]-(i-1)*d

也就是变成一个向下的阶梯

可以证明,最后i高度肯定是高于b[i]

同时我们需要把可行解的最后一项调整为原来的数才行。

每次调整,我们都只从一个数开始到最后一个数都向上调同样的高度,因为这样可以保证我调整后使费用减小的前提下序列依然符合要求,即相邻两个数的差小于等于d。

如果当前解大于a[i]那么上升高度会增大答案,所以要尽可能少上升

同样小于a[i]上升高度减小答案,尽可能逼近

于是定义s=(b[i]<a[i]的数量)-(b[i]>a[i]的数量)

s越大,因为我们调整时是将这一段序列都往上调,所以一个数比原解小,则对于它的调整会使改变量减少,即费用降低;否则,会使改变量增大,即费用升高。

而且要使b[i]与a[i]尽可能近

上升量dlt=min(a[i]-b[i])[a[i]>b[i]]

因为这样我们 up 增加的值可以用 low 增加的值来==抵消==;

而且会有一部分 low 的值会使 ans 减小;

假设我们给j~n加上dlt,那么要考虑b[j]+dlt<=b[j-1]+d的条件

dlt=min(dlt,b[j-1]+d-b[j])

直到a[n]=b[n]为止

假设通过上述操作,现在b[n]已经等于a[n],这个解法就是最优的

1.任何一段区间再增高,不会使答案更优

首先设该区间为[i,j],既然该区间能够升高,那么则必有s1*h>s2*h--->s1>s2

假定[j+1,n]增加过,那么在枚举后缀时,是不会遗漏的,所以此时[i,j]不增高是不可能的

假定[j+1,n]没有增加过,那么,b[j]与b[j+1]的差值必定为d,一旦增加b[j],则解必定不合法

2.任何一段区间再降低,不会使答案更优

设区间为[i,j]

假定[i,j]增高过,那么降低就相当于增高的反操作,也就是撤销增高---既然撤销更优,那么我们根本就不会增加它

假定[i,j]没有增高过,那么他们就必定不能降低---因为初始的b[i~j]已经是可行解的最低高度了

因为每一次起码能把一个b[i]提到与a[i]最近

所以O(n^2)

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long ans,a[],b[],maxs,mind,dlt,n,d,inf=2e15,s;
int main()
{int T,i,j;
cin>>T;
while (T--)
{
cin>>n>>d;
for (i=;i<=n;i++)
scanf("%lld",&a[i]);
if (abs(a[n]-a[])>(n-)*d)
{
cout<<"impossible"<<endl;
continue;
}
b[]=a[];
for (i=;i<=n;i++)
b[i]=b[i-]-d;
while (a[n]!=b[n])
{
dlt=inf;
maxs=-inf;
mind=inf;
s=;
for (i=n;i>=;i--)
{
if (a[i]>b[i])
s++,mind=min(mind,a[i]-b[i]);
else s--;
if (s>maxs&&b[i-]+d>b[i])
{maxs=s;j=i;dlt=mind;}
}
dlt=min(dlt,b[j-]+d-b[j]);
for (i=j;i<=n;i++)
b[i]+=dlt;
}
ans=;
for (i=;i<=n;i++)
ans+=abs(a[i]-b[i]);
cout<<ans<<endl;
}
}

[HNOI2009]通往城堡之路的更多相关文章

  1. 【BZOJ1484】[HNOI2009]通往城堡之路 (贪心)

    [BZOJ1484][HNOI2009]通往城堡之路 (贪心) 题面 BZOJ 洛谷 题解 我大概是不会的. 大概是,首先把所有的人全部弄成最低的值,再一次次拔高一个后缀. 其他的全是抄的,百度随便找 ...

  2. [luogu] P3202 [HNOI2009]通往城堡之路(贪心)

    P3202 [HNOI2009]通往城堡之路 题目描述 听说公主被关押在城堡里,彭大侠下定决心:不管一路上有多少坎坷,不管城堡中的看守有多少厉害,不管救了公主之后公主会不会再被抓走,不管公主是否漂亮. ...

  3. P3202 [HNOI2009]通往城堡之路 神仙题

    这个题不是坑人吗...写个tarjan标签,然后拿这么个神仙题来搞...代码有点看不懂,有兴趣的可以去洛谷题解区看看,懒得想了. 题干: 题目描述 听说公主被关押在城堡里,彭大侠下定决心:不管一路上有 ...

  4. BZOJ1484 [HNOI2009]通往城堡之路

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  5. Java 8特性探究(1):通往lambda之路与 lambda表达式10个示例

    本文由 ImportNew 函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是只包含一个方法的接口.比如Java标准库中的ja ...

  6. 通往Google之路:***

    *** & BBR 安装 系统支持:CentOS 6+, Debian 7+, Ubuntu 12+ 内存要求:≥128M --- 前提 满足以上要求的VPS服务器一台 安装基础命令工具:yu ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. windows类书的学习心得(转载)

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

  9. windows类书的学习心得

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

随机推荐

  1. alpha-咸鱼冲刺day7(后续一波)-紫仪

    总汇链接 一,合照 emmmmm.自然还是没有的. 二,项目燃尽图 三,项目进展 正在写登陆+注册ing 注册搞出来了!!!!!!!!QAQ(喜极而泣!!!!.jpg) 四,问题困难 数据流程大概是搞 ...

  2. mysql基础篇 - 数据库及表的修改和删除

    基础篇 - 数据库及表的修改和删除         修改和删除 一.实验简介 本节实验中,我们将学习并实践如何对数据库的内容做修改,删除,重命名等操作. 二.实验准备 在正式开始本实验内容之前,需要先 ...

  3. XP实验报告

    实验名称:敏捷开发与XP实践 实验人员:20162309邢天岳(结对搭档20162313苑洪铭) 实验日期:2017.5.5 实验内容:1.在IDEA中使用工具(Code->Reformate ...

  4. http post/get 2种使用方式

     public class HttpUtil { //HttpPost public static String executePost(String url, List<NameValue ...

  5. Raid5两块硬盘掉线可以恢复数据吗_raid数据恢复案例分享

    本案例中发生故障的存储类型是HP P2000,虚拟化平台为vmware exsi,共有10块硬盘组成raid5(硬盘容量为1t,其中6号盘是热备盘),由于某些故障导致阵列中两块硬盘亮黄灯掉线,硬盘无法 ...

  6. JS 转换数据类型

    JavaScript 是一种动态数据类型语言,变量是没有类型的,可以随机赋予任意值,若变量要转换数据类型,有两种办法:隐式转换和显式转换. 隐式转换可转换为字符串(将一个值加上字符串) 数字(在值的前 ...

  7. Collaborative Filtering(协同过滤)算法详解

    基本思想 基于用户的协同过滤算法是通过用户的历史行为数据发现用户对商品或内容的喜欢(如商品购买,收藏,内容评论或分享),并对这些喜好进行度量和打分.根据不同用户对相同商品或内容的态度和偏好程度计算用户 ...

  8. Python内置函数(39)——help

    英文文档: help([object]) Invoke the built-in help system. (This function is intended for interactive use ...

  9. Docker学习笔记 - Docker Compose

    一.概念 Docker Compose 用于定义运行使用多个容器的应用,可以一条命令启动应用(多个容器). 使用Docker Compose 的步骤: 定义容器 Dockerfile 定义应用的各个服 ...

  10. R语言学习 第九篇:plyr包

    在数据分析中,整理数据的本质可以归纳为:对数据进行分割(Split),然后应用(Apply)某些处理函数,最后将结果重新组合(Combine)成所需的格式返回,简单描述为:Split - Apply ...