1 条题解

  • 0
    @ 2025-5-6 20:56:44

    解题思路

    1. 函数 grid
      • 函数 grid 接受两个参数 xy,将 xy 转换为整数后相乘并返回结果,即计算在网格布局下可放置元素的数量。
    2. 函数 skew
      • 函数 skew 接受两个参数 xy
      • 首先处理 x,如果 x - 0.5 的整数部分等于 x 的整数部分,则 a2 等于 a1a1x 的整数部分),否则 a2 等于 a1 - 1
      • y1,如果 y 小于 0,则返回 0
      • 初始化 ansa1,定义 d = sqrt(3.0) / 2.0
      • 通过循环,每次循环 y 减去 d,当 y 小于 epseps 定义为 1e-10)时结束循环。在循环中,如果 i 为奇数,ans 加上 a1,否则加上 a2,最后返回 ans,即计算在斜向布局下可放置元素的数量。
    3. 主函数 main
      • 使用 while 循环持续读取输入的 ab
      • 分别调用 grid 函数和 skew 函数计算两种布局下可放置元素的数量 ans1ans2,同时计算 ab 交换顺序后的 gridskew 布局数量,并取最大值。
      • 根据 ans1ans2 的大小关系,输出较大的数量以及对应的布局类型(gridskew)。
    #include <cstdio>
    #include <cstring>
    #include <iomanip>
    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <math.h>
     
    using namespace std;
     
    const double eps=1e-10;
    double a,b;
     
    int grid(double x, double y) {
        return (int) x * (int) y;
    }
     
    int skew(double x, double y) {
        int a1 = (int) x, a2;
        if ((int) (x - 0.5) == (int) x)
            a2 = a1;
        else a2 = a1 - 1.0;
        y -= 1.0;
        if (y < 0.0)return 0;
        int ans = a1;
        double d = sqrt(3.0) / 2.0;
        for (int i = 2;; ++i) {
            y -= d;
            if (y < eps)break;
            if (i & 1) {
                ans += a1;
            } else ans += a2;
        }
        return ans;
    }
     
    int main() {
        while (cin >> a >> b) {
            int ans1 = max(grid(a, b), grid(b, a)), ans2 = max(skew(a, b), skew(b, a));
            if (ans1 >= ans2)
                cout << ans1 << ' ' << "grid" << endl;
            else
                cout << ans2 << ' ' << "skew" << endl;
        }
        return 0;
    }
    
    • 1

    信息

    ID
    320
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者