HDU 6154 CaoHaha's staff(构造)

Description

在方格区域,只能选取方格边(长度为1)或对角边(长度为2),要求构成一个面积不小于n的封闭区域,问最少需要的边数

Input

第一行一整数T表示用例组数,每组用例输入一个整数n(T300,n109)

Output

对于每组用例,输出最少需要的边数

Sample Input

5
1
2
3
4
5

Sample Output

4
4
6
6
7

Solution

考虑m条边可以组成的最大面积,对于每组查询二分查找即可

m为偶数时,显然边全部取对角边构成一个相邻两边长度差最小的矩形面积最大,令x=m2,则取一边长为x22,另一边长取(xx2)2,此时面积为2x2(xx2)

m为奇数时,类似偶数的取法,但是多出一条边,多出的一条边可以使得该矩形的一条边凸出去形成一个梯形,为使多出来的面积尽可能大,当然选取边长较长的一条边,令x=m12,同理可以求出矩形区域的面积为2x2(xx2),而多出来的梯形区域,两底长度分别为(xx2)2(xx21)2,高为22,故面积为12(2(xx2)1),考虑到这里会出现小数,把所有面积全部乘二即可

Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=100005;
ll a[maxn];
int main()
{   
    for(int i=4;i<maxn;i++)
    {
        int j=i/2;
        if(i&1)a[i]=2ll*(j-j/2)*(2*(j/2)+1)-1;
        else a[i]=4ll*(j/2)*(j-j/2);
    }
    int T,n;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        n*=2;
        int ans=lower_bound(a,a+maxn,n)-a;
        printf("%d\n",ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值