N O I P NOIP NOIP 完之后的第一篇题解
ZYB建围墙(wall)
题目描述
ZYB之国是特殊的六边形构造。
已知王国一共有 N N N户家庭,每个家庭需占据一个不同的六边形格子。
王国里交流很频繁,所以这些家庭要构成一个连通区域;同时出于安全考虑,国王 Z Y B ZYB ZYB想在外面“围”一圈墙。
围墙需要遵守这样的规则:
-
墙也是建在格子上的。
-
墙不能建在任何一户家庭占据的格子上。
-
任何一户家庭都不可能走到围墙外面去。
-
围墙不一定要“贴”着家庭建,可以多围一些格子。
定义围墙的长度为它占据的格子的数量。
请你帮国王 Z Y B ZYB ZYB安排每户家庭的具体位置以及围墙的建造方案,使得围墙的长度最短。
输入
只读入一个数,表示家庭的数量N。
输出
输出一个数表示围墙的最小长度。
样例输入
样例输入1
6
样例输入2
9
样例输出
样例输出1
12
样例输出2
14
提示
前
20
%
20\%
20%:
N
≤
10
N≤10
N≤10 。
前
40
%
40\%
40%:
N
≤
20
N≤20
N≤20。
前
70
%
70\%
70%:
N
≤
1000
N≤1000
N≤1000。
另有
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(K∈N)
前
100
%
100\%
100%
1
≤
N
≤
1
0
9
1≤N≤10^9
1≤N≤109。
题解
对于前40分,大概手推是可以推出来的(千万不要数数数错 )
然后手推完前四十分,大概后面规律是可以找出来的:
对于六条边,设边长
−
1
-1
−1为
l
l
l
所以每条边答案变化即为:
l
−
1
l-1
l−1,
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;
}