[haoi2014]走出金字塔
在探险的过程中,考古学家Dr. Kong 无意地被困在一个金字塔中。金字塔中的每个房间都是三角形。Dr. Kong可以破壁走到相邻的房间去。
例如,如果他目前处于三角形(2,2)房间,那么他可以破壁走到三角形(2,1)、(2,3)或(1,1)房间。但破壁一面墙需要花费K分钟时间,而考古学家Dr. Kong 的体能只能支持他到S分钟。
好在Dr. Kong手中有这个金字塔地图,他发现金字塔有许多出口,一旦他进入一个有出口的三角形房间,他再用1分钟就可以走出金字塔。
现在,你能否帮助Dr. Kong找到一个走出金字塔花费时间最少的出口?若能,输出Dr. Kong走出金字塔后还剩下的体能时间(应当大于或等于0);若不能,输出-1。
这题也没什么好说的,主要思路就是找规律.
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<ctime> #include<cmath> #include<algorithm> #include<queue> #include<set> #include<map> #include<iomanip> using namespace std; #define LL long long #define up(i,j,n) for(int i=j;i<=n;i++) #define pii pair<int,int> #define db double #define eps 1e-4 #define FILE "dealing" int read(){ int x=0,f=1,ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0',ch=getchar();} return x*f; } const LL maxn=22000,inf=10000000000000LL; bool cmin(int& a,int b){return a>b?a=b,true:false;} int n,m,k,S,flag=0; pii s,t,p; int main(){ freopen(FILE".in","r",stdin); freopen(FILE".out","w",stdout); int Min=inf; n=read(),m=read(),k=read(),S=read(); s.first=read(),s.second=read(); p=s; up(i,1,m){ s=p; int ans=0; t.first=read(),t.second=read(); if(s.first>t.first)swap(s,t); int left=s.second,right=(t.first-s.first)*2+s.second; ans+=(t.first-s.first)*2; if(t.second>=left&&t.second<=right){ if(t.second%2!=s.second%2)ans--; cmin(Min,ans); continue; } else { ans+=min(abs(t.second-right),abs(t.second-left)); cmin(Min,ans); continue; } } LL ans=(LL)Min*k+1; if(ans<=S)cout<<S-ans<<endl; else cout<<-1<<endl; return 0; }