1 条题解
-
0
解题思路
- 函数
grid:- 函数
grid接受两个参数x和y,将x和y转换为整数后相乘并返回结果,即计算在网格布局下可放置元素的数量。
- 函数
- 函数
skew:- 函数
skew接受两个参数x和y。 - 首先处理
x,如果x - 0.5的整数部分等于x的整数部分,则a2等于a1(a1是x的整数部分),否则a2等于a1 - 1。 - 将
y减1,如果y小于0,则返回0。 - 初始化
ans为a1,定义d = sqrt(3.0) / 2.0。 - 通过循环,每次循环
y减去d,当y小于eps(eps定义为1e-10)时结束循环。在循环中,如果i为奇数,ans加上a1,否则加上a2,最后返回ans,即计算在斜向布局下可放置元素的数量。
- 函数
- 主函数
main:- 使用
while循环持续读取输入的a和b。 - 分别调用
grid函数和skew函数计算两种布局下可放置元素的数量ans1和ans2,同时计算a和b交换顺序后的grid和skew布局数量,并取最大值。 - 根据
ans1和ans2的大小关系,输出较大的数量以及对应的布局类型(grid或skew)。
- 使用
#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
- 上传者