ZROI 2018 ZYB建围墙

N O I P NOIP NOIP 完之后的第一篇题解

ZYB建围墙(wall)

题目描述

ZYB之国是特殊的六边形构造。

已知王国一共有 N N N户家庭,每个家庭需占据一个不同的六边形格子。

王国里交流很频繁,所以这些家庭要构成一个连通区域;同时出于安全考虑,国王 Z Y B ZYB ZYB想在外面“围”一圈墙。

围墙需要遵守这样的规则:

  1. 墙也是建在格子上的。

  2. 墙不能建在任何一户家庭占据的格子上。

  3. 任何一户家庭都不可能走到围墙外面去。

  4. 围墙不一定要“贴”着家庭建,可以多围一些格子。

定义围墙的长度为它占据的格子的数量。

请你帮国王 Z Y B ZYB ZYB安排每户家庭的具体位置以及围墙的建造方案,使得围墙的长度最短。

输入
只读入一个数,表示家庭的数量N。

输出
输出一个数表示围墙的最小长度。

样例输入

样例输入1
6
样例输入2
9

样例输出

样例输出1
12
样例输出2
14

提示

20 % 20\% 20% N ≤ 10 N≤10 N10
40 % 40\% 40% N ≤ 20 N≤20 N20
70 % 70\% 70% N ≤ 1000 N≤1000 N1000
另有 10 % 10\% 10% N = 6 × K ( K + 1 ) 2 + 1 ( K ∈ N ) N=6×K(K+1)2+1(K∈N) N=6×K(K+1)2+1(KN)
100 % 100\% 100% 1 ≤ N ≤ 1 0 9 1≤N≤10^9 1N109

题解
对于前40分,大概手推是可以推出来的(千万不要数数数错
然后手推完前四十分,大概后面规律是可以找出来的:
对于六条边,设边长 − 1 -1 1 l l l
所以每条边答案变化即为:
l − 1 l-1 l1 l l l l l l l l l l l l l + 1 l+1 l+1
直接计算即可

#include<bits/stdc++.h>
using namespace std;
#define J if(n>0)
long long n,ans;
int main(){
    scanf("%lld",&n); ans=6;n--;
    for(int i=1;;i++){
        if(n<=0) break;
        J n-=i-1,ans++;
        J n-=i,ans++;
        J n-=i,ans++;
        J n-=i,ans++;
        J n-=i,ans++;
        J n-=i+1,ans++;
    }
    printf("%lld",ans);
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可爱の小公举

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值