zoukankan      html  css  js  c++  java
  • [CF1421D] Hexagons

    [CF1421D] Hexagons

    Description

    给定一个由六边形密铺组成的坐标系中的点的坐标规律。从(0,0)出发,要到达(x,y),6种方向每种走一步都有一个费用,询问最小到达终点的费用。

    Solution

    如果让所有 a(x) 对 a(x-1) + a(x+1) 取 Min,那么最后一定能分解成不超过两段

    枚举方向,对于一个确定的方向,解方程即可

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    
    const int dx[6] = {1, 0, -1, -1, 0, 1};
    const int dy[6] = {1, 1, 0, -1, -1, 0};
    
    void solve()
    {
        int x, y, c[6];
        cin >> x >> y;
        for (int i = 0; i < 6; i++)
            cin >> c[i];
        for (int i = 0; i < 6; i++)
            c[(i + 1) % 6] = min(c[(i + 1) % 6], c[i] + c[(i + 2) % 6]);
        int ans = 2e18;
        for (int i = 0; i < 6; i++)
        {
            for (int j = i + 1; j < 6; j++)
            {
                if ((dx[j] * dy[i] - dx[i] * dy[j]) == 0)
                    continue;
                if ((dx[i] * dy[j] - dx[j] * dy[i]) == 0)
                    continue;
                int ai = (dx[j] * y - x * dy[j]) / (dx[j] * dy[i] - dx[i] * dy[j]);
                int aj = (dx[i] * y - x * dy[i]) / (dx[i] * dy[j] - dx[j] * dy[i]);
                if (ai >= 0 && aj >= 0)
                    ans = min(ans, ai * c[i] + aj * c[j]);
            }
        }
        cout << ans << endl;
    }
    
    signed main()
    {
        ios::sync_with_stdio(false);
    
        int t;
        cin >> t;
        while (t--)
        {
            solve();
        }
    }
    
  • 相关阅读:
    centos7 安装prometheus node_exporter
    RMAN备份演练初级篇
    RMAN命令
    oracle数据库的归档模式
    oracle的会话(session)
    oracle的例程
    oracle热备份
    Oracle数据库归档模式的切换及其相关操作详解
    Oracle角色
    类名.class, class.forName(), getClass()区别
  • 原文地址:https://www.cnblogs.com/mollnn/p/14488620.html
Copyright © 2011-2022 走看看