[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;
}

  

posted @ 2017-02-27 20:02  CHADLZX  阅读(373)  评论(0编辑  收藏  举报