题目传送门: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;
}
Comments NOTHING