题目来源
牛客网
链接:不要二
题目描述
二货小易有一个W*H的网格盒子,网格的行编号为0~ H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根,小易想知道最多可以放多少块蛋糕在网格盒子里。
输入描述:
每组数组包含网格长宽W,H,用空格分割.(1 ≤ W、H ≤ 1000)
输出描述:
输出一个最多可以放的蛋糕数
输入:
3 2
输出:
4
解题思路
题中关键点:( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根等于2不能放蛋糕,这里将该条件变成:( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) ==4不能放蛋糕,等于4有以下几种情况:
1+3=4
3+1=4
2+2=4
0+4=4
4+0=4
显然,前3个是不可能的,因为(x1-x2) * (x1-x2) 或 (y1-y2) * (y1-y2)不可能等于2或3,要么等于0,要么等于4。
得出结论:满足条件x1 == x2,y1-y2 == 2或者x1-x2 == 2,y1 == y2.
代码展示
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int w, h, res = 0;
cin >> w >> h;
vector<vector<int>> a;
a.resize(w);
for(auto& e : a)
e.resize(h, 1);
for(int i = 0;i < w;i++)
{
for(int j = 0;j < h;j++)
{
if(a[i][j] == 1)
{
res++;
if((i + 2) < w)
a[i + 2][j] = 0;
if((j + 2) < h)
a[i][j + 2] = 0;
}
}
}
cout << res << endl;
return 0;
}