[HAOI2014] 走出金字塔 - 找规律

给定一个金字塔,有 \(n\) 层,\(m\) 个出口,破一面墙的时间为 \(k\)\(s\) 表示体能维持时间。问能否走出,且走出后剩余的时间。

Solution

枚举每个出口,试图计算从每个出口出去的时间

而这就是计算一对点之间的最短路,考虑将最上面那么点设为塔顶,设它原来的坐标为 \((x_0,y_0)\),两者的坐标差为 \((\Delta x,\Delta y)\)

如果 \(y_0 = 1\bmod 2\),若 \(\Delta y = 0 \bmod 2\),则 \(d=2\Delta x\),否则 \(d=2\Delta x-1\)

如果 \(y_0 = 0\bmod 2\),若 \(\Delta y = 0 \bmod 2\),则 \(d=2\Delta x\),否则 \(d=2\Delta x+1\)

如果超出了可以到达的部分,就补上多出的距离

(读错题自闭十年)

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 10005;
int n,m,k,s,x[N],y[N],aans=1e18;

signed main() {
    ios::sync_with_stdio(false);
    cin>>n>>m>>k>>s;
    cin>>x[0]>>y[0];
    for(int i=1;i<=m;i++) {
        cin>>x[i]>>y[i];
    }
    for(int i=1;i<=m;i++) {
        int ans=0;
        int x0=x[0],y0=y[0],x1=x[i],y1=y[i];
        if(x0>x1) swap(x0,x1),swap(y0,y1);
        int dx=abs(x1-x0); int dy=abs(y1-y0);
        int lb=y0,rb=y0+2*dx;
        if(y1<lb || y1>rb)
            ans=min(abs(y1-lb),abs(y1-rb)),dy=0;
        if(y0%2==1) {
            if(dy%2==0) ans+=2*dx;
            else ans+=2*dx-1;
        }
        else {
            if(dy%2==0) ans+=2*dx;
            else ans+=2*dx+1;
        }
        aans=min(aans,ans);
    }
    cout<<max(-1ll,s-k*aans-1);
}

猜你喜欢

转载自www.cnblogs.com/mollnn/p/12423648.html
今日推荐