ZROI 2018 ZYB建圍牆

NOIPNOIP 完之後的第一篇題解

ZYB建圍牆(wall)

題目描述

ZYB之國是特殊的六邊形構造。

已知王國一共有NN戶家庭,每個家庭需佔據一個不同的六邊形格子。

王國裏交流很頻繁,所以這些家庭要構成一個連通區域;同時出於安全考慮,國王ZYBZYB想在外面“圍”一圈牆。

圍牆需要遵守這樣的規則:

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

  2. 牆不能建在任何一戶家庭佔據的格子上。

  3. 任何一戶家庭都不可能走到圍牆外面去。

  4. 圍牆不一定要“貼”着家庭建,可以多圍一些格子。

定義圍牆的長度爲它佔據的格子的數量。

請你幫國王ZYBZYB安排每戶家庭的具體位置以及圍牆的建造方案,使得圍牆的長度最短。

輸入
只讀入一個數,表示家庭的數量N。

輸出
輸出一個數表示圍牆的最小長度。

樣例輸入

樣例輸入1
6
樣例輸入2
9

樣例輸出

樣例輸出1
12
樣例輸出2
14

提示

20%20\%N10N≤10
40%40\%N20N≤20
70%70\%N1000N≤1000
另有10%10\% N=6×K(K+1)2+1(KN)N=6×K(K+1)2+1(K∈N)
100%100\% 1N1091≤N≤10^9

題解
對於前40分,大概手推是可以推出來的(千萬不要數數數錯
然後手推完前四十分,大概後面規律是可以找出來的:
對於六條邊,設邊長1-1ll
所以每條邊答案變化即爲:
l1l-1lllllllll+1l+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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章