HAOI2014 走出金字塔

题目链接:戳我

找规律。

不过为了方便,每次我们计算入口和某一个出口之间需要花费的体力值的时候,不妨把x较小的假设成塔顶,这样的话另一个就不需要分类讨论了。

详细请看代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define MAXN 1000010
using namespace std;
int n,m,r,s,x,y,xx,yy;
int ans=2147483647,cur_ans;
struct Node{int x,y;}node[MAXN];
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("ce.in","r",stdin);
    #endif
    scanf("%d%d%d%d",&n,&m,&r,&s);
    for(int i=0;i<=m;i++)
        scanf("%d%d",&node[i].x,&node[i].y);
    for(int i=1;i<=n;i++)
    {
        x=node[i].x,y=node[i].y;
        xx=node[0].x,yy=node[0].y;
        cur_ans=0;
        if(x<xx) swap(xx,x),swap(yy,y);
        if(y%2==0) x--,y--,cur_ans++;
        if(yy%2==0) xx--,yy--,cur_ans--;
        x-=xx; y-=yy-1;
        if(y<1) cur_ans+=1-y;
        if(y>(2*(x+1)-1)) cur_ans+=y-2*(x+1)+1;
        cur_ans+=2*x;
        ans=min(ans,cur_ans);
    }
    ans*=r;
    if(ans+1<=s) printf("%d\n",s-ans-1);
    else printf("-1\n");
    return 0;	
}

posted @ 2019-03-05 07:43  风浔凌  阅读(122)  评论(0编辑  收藏  举报