zoukankan      html  css  js  c++  java
  • [HAOI2014] 走出金字塔

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

    Solution

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

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

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

    如果 (y_0 = 0mod 2),若 (Delta y = 0 mod 2),则 (d=2Delta x),否则 (d=2Delta 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);
    }
    
    
  • 相关阅读:
    jQuery使用手册
    数据结构排序算法总结(转)
    VS2008升级激活码
    用VS2005建立解决方案
    backgroundposition 用法详细介绍
    CSS布局口诀,学ccs不再难
    Web.Config文件中SQLServerExpress数据库连接配置解释(转)
    css
    2011,我来了!
    Ajax验证用户名是否存在
  • 原文地址:https://www.cnblogs.com/mollnn/p/12423648.html
Copyright © 2011-2022 走看看