CF1340C Nastya and Unexpected Guest
Posted handlip
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1340C Nastya and Unexpected Guest相关的知识,希望对你有一定的参考价值。
题目
给你一条长度为 (n) 的马路(可以将马路视为一个数轴),你要从 0 位置开始到达 (n) 位置,你每秒走 1 个长度单位。在马路上有 (m) 个安全岛,它们的位置已给定。该马路的绿灯亮 (g) 秒,红灯亮 (r) 秒,第 0 秒时信号灯刚由红灯变为绿灯。
绿灯亮时,你必须一直向前走,到达一个安全岛时,你可以选择调头。红灯亮时,你必须一直停在某个安全岛处,直到绿灯再次亮起。求你最快需要多少秒能从马路的 0 位置到达 (n) 位置(无法到达则输出 -1)。
数据范围
(n le 10^6)
(m le 10^4)
(g,r le 10^3)
限制
时间:1s
空间:256M
代码
# include<bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
const int MAX1 = 1e4 + 5;
const int MAX2 = 1e3 + 5;
const int INF = 2.1e9;
int n, m, t1, t2;
int a[MAX1];
int dis[MAX1][MAX2];
deque<pii> q;
void update(int x1, int y1, int x2, int y2, int w)
{
if (x1 > 0 && x1 <= m && y1 <= t1 && dis[x2][y2] + w < dis[x1][y1])
{
dis[x1][y1] = dis[x2][y2] + w;
if (w)
{
q.push_back({x1, y1});
}
else
{
q.push_front({x1, y1});
}
}
}
int main()
{
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; ++i)
{
scanf("%d", &a[i]);
}
scanf("%d %d", &t1, &t2);
sort(a + 1, a + m + 1);
for (int i = 1; i <= m; ++i)
{
for (int j = 0; j <= t1; ++j)
{
dis[i][j] = INF;
}
}
dis[1][0] = 0;
q.push_back({1, 0});
while (!q.empty())
{
pii p = q.front();
q.pop_front();
if (p.second == t1)
{
update(p.first, 0, p.first, p.second, 1);
}
else
{
update(p.first - 1, p.second + (a[p.first] - a[p.first - 1]), p.first, p.second, 0);
update(p.first + 1, p.second + (a[p.first + 1] - a[p.first]), p.first, p.second, 0);
}
}
int ans = INF;
for (int i = 0; i <= t1; ++i)
{
if (dis[m][i] != INF)
{
ans = min(ans, (t1 + t2) * dis[m][i] + i);
}
}
printf("%d", ans == INF ? -1 : ans);
return 0;
}
以上是关于CF1340C Nastya and Unexpected Guest的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces 1340C Nastya and Unexpected Guest(01bfs)