“牛客一小步,知识成长一大步”【牛客】”不要二”

牛客 ”不要二”

本题链接

题目描述
二货小易有一个W*H的网格盒子,网格的行编号为0H-1,网格的列编号为0W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。
对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根
小易想知道最多可以放多少块蛋糕在网格盒子里。
输入描述:

每组数组包含网格长宽W,H,用空格分割.(1 ≤ W、H ≤ 1000)

输出描述:

输出一个最多可以放的蛋糕数

示例1
输入

3 2

输出

4

【题目分析】
本题看起来很难,主要是难在了理解上
本题的重点是要读懂题意,并且需要多读两遍,才能读懂,本题本质就是在二维数组中每个坐标去放蛋糕, 一个坐标位置放了蛋糕,跟他欧几里得距离为2的位置不能放蛋糕,这个就是关键点。对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为: ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根 。
也就是说:如果(x1,y1)放了蛋糕,则满足 ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) == 4的(x2,y2)不能放蛋糕。
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) == 4看起来是一个无解的表达式。但是可以进行加法表达式分解:
其解的可能性:
1+3=4
3+1=4
2+2=4
0+4=4
4+0=4
仔细分析前三个表达式是不可能的,因为(x1-x2) * (x1-x2)表达式结果不能等于2或3。也就是说( (x1-x2) * (x1-x2) 和(y1-y2) * (y1-y2) )两个表达式一个等于0,一个等于4.
可以看出:假设放蛋糕的位置是(x1,y1),则不能放蛋糕的位置(x2,y2),满足x1x2,y1-y22或者x1- x22,y1y2.
【解题思路】:
仔细读理解了上面的题目解读,本题就非常简单了,使用vector<vector>定义一个二维数组,resize开空间并初始化,每个位置初始化为1,表示当蛋糕,a[i][j]位置放蛋糕,则可以标记处a[i][j+2]a[i+2][j]位置不能放蛋糕,遍历一遍二维数组,标记处不能放蛋糕的位置,统计也就统计出了当蛋糕的位置数。
【代码解析】:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int w ,h;//定义长和宽
    int ret = 0;//记录存放个数
    cin>>w>>h;
    vector<vector<int>> array;
    //给二维数组开空间并初始化
    array.resize(w);
    for(auto& e : array)
       e.resize(h,1);
    for(int i = 0;i < w;i++)
    {
        for(int j = 0;j < h;j++)
        {
            if(array[i][j] == 1)
            {
                ret++;
                if(j + 2 < h)
                    array[i][j + 2] = 0;
                if(i + 2 < w)
                    array[i + 2][j] = 0;
            }
        }
    }
    cout<<ret<<endl;
    return 0; 
}

【本题难点】
1.可能读不懂题意,一脸懵逼,要巧用数学思维解决
2.二维数组的初始化,resize开空间并初始化函数的使用

发布了33 篇原创文章 · 获赞 105 · 访问量 8461

猜你喜欢

转载自blog.csdn.net/qq_43676757/article/details/105317068
今日推荐