HDU

来源:互联网 发布:淘宝发布宝贝主图尺寸 编辑:程序博客网 时间:2024/06/08 13:54

题目大意:

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

分析:

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

代码:

#include<bits/stdc++.h>#define maxn 500000using 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;            }        }    }}