题目大意:

在一个二维坐标系中,给你一个整数面积 S ,让你用尽量少的边围出一个封闭图形,使得该图形的面积大于等于 S 。每条边可以是长为 1 的平行或垂直于坐标轴的线段或者斜率为 1 或 -1 长为 2 的线段。

分析:

首先至少 4 条边才能围成封闭图形,然后我考虑对于每一条边,最多能围成的面积。如果是偶数条边,那么就是使得两条边长度差最小得到的面积。如果是奇数条边,那么就是,首先少用一条,然后围成一个偶数条边的最大矩形,之后在这个矩形的较长边上增加一条边,可以突出一个梯形的部分,这就是对应的最大面积。打好表之后,对于每一个给入的 S,扫一遍就行了。

代码:

#include<bits/stdc++.h>
#define maxn 500000
using namespace std;
long long int f[maxn];
void init()
{
    f[4]=2;
    f[5]=2;
    for(int i=6;i<maxn;i++)
    {
        if(i%2==0)
        {
            if(i%4!=0)f[i]=(long long int)(i/4)*(long long int)(i/4+1)*2;
            else f[i]=(long long int)(i/4)*(long long int)(i/4)*2;
        }
        else
        {
            if((i-1)%4!=0)f[i]=f[i-1]+(long long int)(i-1)/4;
            else f[i]=f[i-1]+(long long int)(i-1)/4-1;
        }
        //else f[i]=(long long int)((i-1)/4)*(long long int)((i-1)/4+1)*2+(long long int)((i-1)/4);
    }
}

int main()
{
    init();
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int s;
        scanf("%d",&s);
        for(int i=4;i<maxn;i++)
        {
            if(f[i]>=s)
            {
                printf("%d\n",i);
                break;
            }
        }
    }


}