man
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]));
}
}
随机推荐
- Docker容器技术的核心原理
目录 1 前言 2 docker容器技术 2.1 隔离:Namespace 2.2 限制:Cgroup 2.3 rootfs 2.4 镜像分层 3 docker容器与虚拟机的对比 1 前言 上图是百度 ...
- 线段树:CDOJ1597-An easy problem C(区间更新的线段树)
An easy problem C Time Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...
- German Collegiate Programming Contest 2018 B. Battle Royale
Battle Royale games are the current trend in video games and Gamers Concealed Punching Circles (GCPC ...
- Android兼容性测试CTS --环境搭建、测试执行、结果分析
为了确保Android应用能够在所有兼容Android的设备上正确运行,并且保持相似的用户体验,在每个版本发布之时,Android提供了一套兼容性测试用例集合(Compatibility Test S ...
- Alpha版(内部测试版)发布
首先通过微信扫吗下载我们的软件校园服务,首先进去登录界面没账号点击注册,注册完就可以登录了,进去界面我们在二手交易这项功能里我们即可以事卖家又可以是买家如果我们卖东西点击商品出售,填写商品信息,商品图 ...
- Hydux: 一个 Elm-like 的 全功能的 Redux 替代品
在学习和使用 Fable + Elmish 一段时间之后,对 Elm 架构有了更具体的了解, 和预料中的一样,Redux 这种来自 Elm 的风格果然还是和强类型的 Meta Language 语言更 ...
- MFC自绘按钮的实现,按钮动态效果
最近项目需要实现按钮的动态效果,多方学习,现在终于能实现一些功能了. 过程如下: 第一,新建一MFC对话框应用程序. 第二,删除自带按钮,并添加两个按钮,button1,button2,ID为IDB_ ...
- MacOS常用软件推荐
1.效率提升神器Alfred 可以搜索文件.应用.web搜索.词典等等 链接:https://pan.baidu.com/s/1igv4tuXkuMFOPT9E6Cc5Jg 密码:3o51 软件解压密 ...
- 博客笔记(blog notebook)
1. 机器学习 2. NLP 3. code 实际好人 实际坏人 预测百分比 预测好人 \(p_GF^c(s_c\|G)\) \(p_BF^c(s_c\|B)\) \(F^c(s_c)\) 预测坏人 ...
- Codeforces Round #410 (Div. 2) A. Mike and palindrome
A. Mike and palindrome time limit per test 2 seconds memory limit per test 256 megabytes input stand ...