Codeforces Global Round 13 B
大意
略...
思路
题目中有两个关键点
- 每一行仅有一个障碍
- 第0列和第1e6+1列不存在障碍
考虑有几种移动情况
-
不用移动
此时,对应的两行障碍的位置差值大于等于2
因为第0行没有障碍,所以可以通过第0列走到对应位置,又因为每行仅有一个障碍且第1e6+1列不存在障碍,所以可以穿过差值大于等于2的两行障碍之间的格点到达第1e6+1列,然后走到终点
-
min(u, v)
此时,对应的两行障碍之间的位置差值等于1
-
u+v
此时,对应的两行障碍之间的差值等于0
-
2*v
此时,对应的两行障碍之间的差值等于0
容易发现,因为题述关键点,无论障碍位于什么位置,上述四种情况总成立。
代码
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
#define ull unsigned long long
#define cint const int&
#define Pi acos(-1)
const int mod = 1e9+7;
const int inf_int = 0x7fffffff;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;
int t;
int n, u, v;
int a[100100];
int main() {
cin >> t;
while(t--) {
cin >> n >> u >> v;
for(int i=1; i<=n; i++) cin >> a[i];
int ans = inf_int;
for(int i=1; i<=n; i++) {
//between row
if(i != n)
if(a[i+1] != a[i]) {
ans = min(ans, u);
} else {
ans = min(ans, u+v);
}
// between column
if(i != n)
if(a[i+1] != a[i]) {
if(abs(a[i+1] - a[i]) >= 2) ans = 0;
else {
ans = min(ans, v);
}
} else ans = min(ans, 2*v);
}
cout << ans << endl;
}
return 0;
}
37min, -1