CF544B Sea and Islands-题解

ZhanPJ 发布于 2022-04-05 38 次阅读


题目传送门:CF544B Sea and Islands

题意简述

已知有一个 n \times n 的取余,要塞下 k 个小岛,求能不能塞下这 k 座岛屿。

算法

贪心,模拟。
时间复杂度:
- 在不能塞下 k 座岛屿时,时间复杂度为 O(1)
- 在能塞下 k 座岛屿时,时间复杂度为 O(n^2)。(实际上就是输出要这么长时间)

思路:

我们可以发现,判定这个岛屿是否能够被塞下可以这么看。
例如:
n=3,k=5 时,岛屿可以这样塞下:

LSL
SLS
LSL

n=3,k=6 时,岛屿不可以塞下。

注意到在 k > \frac{n^2+1}{2} 时,不可以塞下,即最优方案是以斜角去放下所有岛屿。
在我们放岛屿的时候,还有一点需要注意:当已经放的岛屿数量够了,那就不需要继续放岛屿了

AC 代码:

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    if((n*n+1)/2<k)printf("NO\n");
    else{
        printf("YES\n");
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(!k)printf("S");
                else if(!(i%2)){//这是个人的偷懒,在 C++ 中,整形变量不是 0,返回值就是 true。
                    if(!(j%2))printf("L"),k--; 
                    else printf("S");
                }else{
                    if(j%2)printf("L"),k--; 
                    else printf("S");
                }
            }
            printf("\n");
        }
    }

    return 0;
}