【每日一题】不要二

题目来源
牛客网
链接:不要二

题目描述
二货小易有一个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;
}

猜你喜欢

转载自blog.csdn.net/zhao_leilei/article/details/110424030