题解:P15050 [UOI 2023 II Stage] Pixel snail

· · 题解

~~没错我又来水题解了。
这句话好像已经成为我的题解的开头了……~~

思路

题目人还怪好的,足足给了 4 个图,足够我们观察规律了。

第一步

首先看标注 1 的小方格,从 k=2 开始都可以将第一步看作是:一个大方块里面挖掉了一个小方块。
观察可得:大方块的边长是 k,小方块的边长是 k-2
所以第一步使用了 k^2-(k-2)^2 个方格。
注意要特判 k=1 第一步用 1 个。

第二步 & 第三步

把第二步的唯一一个小方格向右平移一格,可以和其他的一些 3 号格子凑出恰好 3 行,其中每一行是 k+2 个格子。
一共 3(k+2) 个格子。

最后的小尾巴

观察图片,最后还有一个长度为 k 的小尾巴。

最后提醒一句

十年 OI 一场空;
不开 long long 见祖宗。

代码

注:第一步 k=1 的特判被我用一个 \max 函数解决了,没有写 if。想写的话可以自己试试。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    ll k; cin >> k;
    ll a1 = k*k - max(k-2,0ll)*max(k-2,0ll);
    ll a2 = (k+2) * 3;
    ll a3 = k;
    ll ans = a1 + a2 + a3;
    cout << ans;
}