给定一个金字塔,有 \(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);
}