Description

n间房子高度不同,Man 要从最矮的房子按照高度顺序跳到最高的房子,你知道房子的顺序,以及Man一次最远可以跳多远,相邻的房子至少有1的距离,房子的宽不计,现在由你安排相邻房子的距离,使Man可以跳到最高的房子且让最矮的房子与最高的房子距离最远,没有合法方案输出-1

Input

第一行一个整数T表示数据组数,每组数据第一行两个整数n,d分别表示房子数量以及Man一次可以跳多远,第二行n个整数用空格隔开,第i个整数表示第i个房子的高度

Output

每组数据输出‘Case ’+第几组数据+‘: ’+最远距离

Sample Input

样例输入:

3

4 4

20 30 10 40

5 6

20 34 54 10 15

4 2

10 20 16 13

样例输出:

Case 1: 3

Case 2: 3

Case 3: -1

HINT

数据范围:

对于40%的数据 n < 8 t=2 d < 10

对于100%的数据 n < 10001 d < 1000000 t < 100 高度 < 1000000


差分约束典型题…

关于如何理解 选取起点和终点中靠左边的点, 开始跑一遍最短路就可以得到答案, 这里提供一种思路: 在跑最短路之前, dis被设置为INF, 跑最短路的过程就是为了使dis满足约束条件. 只要跑完最短路, dis[t]必定就是最大的. 至于为什么要选取起点和终点中靠左的开始跑最短路, 理由是dis[t]维护的是s到t的距离的最大值. 这个假如t在s的左边, 则距离为负, 则维护的实际上是t到s的距离的最小值. 因此要确保起始遍历的点在终结点的左边.

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
const int maxN = 1000;
const int maxRoom = (int)1e6;
struct building
{
int h, id;
}a[maxN];
int head[maxN];
int top;
struct edge
{
int v, w, next;
}G[maxN << 2];
void addEdge(int u, int v, int w)
{
G[top].v = v;
G[top].w = w;
G[top].next = head[u];
head[u] = top ++;
}
int operator <(building x, building y)
{
return x.h < y.h;
}
int dis[maxN];
int Q[maxRoom];
int inQ[maxN];
int vis[maxN];
int main()
{
#ifndef ONLINE_JUDGE
freopen("man.in", "r", stdin);
freopen("man.out", "w", stdout);
#endif
ios::sync_with_stdio(false);
int T, _case = 0;
for(cin >> T; T; T --)
{
int n, d;
cin >> n >> d;
memset(head, - 1, sizeof(head));
top = 0;
for(int i = 0; i < n; i ++)
{
cin >> a[a[i].id = i].h;
if(i)
addEdge(i, i - 1, - 1);
}
sort(a, a + n);
for(int i = 1; i < n; i ++)
{
int u = a[i - 1].id, v = a[i].id;
if(u > v)
swap(u, v);
addEdge(u, v, d);
}
int L = 0, R = 1, s = a[0].id, t = a[n - 1].id;
if(s > t)
swap(s, t);
Q[L] = s;
memset(dis, 127, sizeof(dis));
dis[s] = 0;
memset(inQ, 0, sizeof(inQ));
inQ[s] = 1;
memset(vis, 0, sizeof(vis));
vis[s] = 1;
int flag = 0;
while(L < R)
{
int u = Q[L];
for(int i = head[u]; i != - 1; i = G[i].next)
{
int v = G[i].v;
if(dis[u] + G[i].w >= dis[v])
continue;
dis[v] = dis[u] + G[i].w;
if(! inQ[v])
{
inQ[v] = 1;
Q[R ++] = v;
vis[v] ++;
if(vis[v] > n)
{
flag = 1;
break;
}
}
}
inQ[u] = 0;
L ++;
}
if(flag)
printf("Case %d: -1\n", ++ _case);
else
printf("Case %d: %d\n", ++ _case, abs(dis[t]));
}
}

随机推荐

  1. csapp-15213错误修正18-10-28

    1.p229 练习题3.15 b.答案错误,应为400419

  2. Linux学习-备份要点

    备份资料的考虑 老实说,备份是系统损毁时等待救援的救星!因为你需要重新安装系统时, 备份的好坏会影响到你 系统复原的进度!事实上,系统有可能由于不预期的伤害而导致系统发生错误! 什么是不预期的伤害呢? ...

  3. 有限状态机(FSM)的设计与实现

    有限状态机(FSM)是表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用.通常FSM包含几个要素:状态的管理.状态的监控.状态的触发.状态触发后引发的动作.本文主要 ...

  4. UVa 1366 DP Martian Mining

    网上的题解几乎都是一样的: d(i, j, 0)表示前i行前j列,第(i, j)个格子向左运输能得到的最大值. d(i, j, 1)是第(i, j)个格子向上运输能得到的最大值. 但是有一个很关键的问 ...

  5. IDEA-常用插件,使用FindBugs寻找bug,代码分析

    bug无处不在,但是我们总希望少一点bug. 最近发现了一款好用的寻找bug的插件,特此记下. 一.安装 路径:File-->Settings-->Plugins-->Browse ...

  6. 关于.net 项目 nuget包还原项目失败的记录

    在.net项目中,一般通过vs打开项目,会自动进行nuget包还原,可能因为其他一些因素,包还原失败,同时在之前包依赖是可以正常使用,现在却提示包 AutoMapper 6.2.2 与 netcore ...

  7. Selenium WebDriver- 操作浏览器的cookie

    #encoding=utf-8 import unittest import time from selenium import webdriver from selenium.webdriver i ...

  8. Django 中CSRF中间件 'django.middleware.csrf.CsrfViewMiddleware',

    1.Django中CSRF中间件的工作原理及form表单提交需要添加{% csrf_token %}防止出现403错误 CSRF # 表示django全局发送post请求均需要字符串验证功能:防止跨站 ...

  9. 【LeetCode】Binary Tree Level Order Traversal(二叉树的层次遍历)

    这道题是LeetCode里的第102道题. 题目要求: 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15 ...

  10. 精通CSS高级Web标准解决方案(1-3 规划、组织与维护样式表)

    对文档应用样式 对代码进行注释/*......*/ 结构性注释 自我提示 删除注释.优化样式表 样式指南:解释代码与站点的视觉设计是如何组织在一起的 站点结构.文件结构.命名规则 编码标准:(X)ht ...