题目大意:
在一个二维坐标系中,给你一个整数面积 S ,让你用尽量少的边围出一个封闭图形,使得该图形的面积大于等于 S 。每条边可以是长为 1 的平行或垂直于坐标轴的线段或者斜率为 1 或 -1 长为
分析:
首先至少 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;
}
}
}
}