Codeforces Global Round 13 B

Codeforces Global Round 13 B

大意

略...

思路

题目中有两个关键点

  1. 每一行仅有一个障碍
  2. 第0列和第1e6+1列不存在障碍

考虑有几种移动情况

  1. 不用移动

    此时,对应的两行障碍的位置差值大于等于2

    因为第0行没有障碍,所以可以通过第0列走到对应位置,又因为每行仅有一个障碍且第1e6+1列不存在障碍,所以可以穿过差值大于等于2的两行障碍之间的格点到达第1e6+1列,然后走到终点

  2. min(u, v)

    此时,对应的两行障碍之间的位置差值等于1

  3. u+v

    此时,对应的两行障碍之间的差值等于0

  4. 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

原文地址:https://www.cnblogs.com/ullio/p/14494895.html