专栏文章

题解:P7029 [NWRRC 2017] Kotlin Island

P7029题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min13dxc
此快照首次捕获于
2025/12/01 18:50
3 个月前
此快照最后确认于
2025/12/01 18:50
3 个月前
查看原文

题目大意

给定高为 hh 且宽为 ww 的网格,初始时全为陆地,你需要在上面构造任意条横贯网格的水渠使得会有 kk 个陆地不连通。

解题思路

不难发现放置得到最多陆地的最优解,就是陆地是一个间隔一个的时候放置的最多,如图所示:
如图所示
所以最终的答案一定可以在这上面的基础上增添水渠得到,于是我们可以枚举横向可放置的数量 ii 以及纵向可放置的数量 jj,若出现二者相乘等于 kk 那么一定是答案的一种,只需要保留 i×ji\times j 的陆地数量,其余的全部修改成水渠即可!

代码如下

CPP
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
char mp[200][200];
void sc(int x,int y){
	int h=0,s=0;//只保留x*y,其余的全部设置为"#"
	for(int i=1;i<=n;i++){
		int gs=0;
		h+=(i%2==1);
		for(int j=1;j<=m;j++){
			if(mp[i][j]=='.'&&gs<y&&h<=x)cout<<mp[i][j],gs++;
			else cout<<"#";
		}
		cout<<'\n';
	}
	return ;
}
int main(){
	cin>>n>>m>>k;
	for(int i=1;i<=n;i+=2)for(int j=1;j<=m;j+=2)mp[i][j]='.';//预处理出以上图片中的样子
	int nn=ceil(n/2.0),mm=ceil(m/2.0);//横向和纵向可放置的最多个
	for(int i=1;i<=nn;i++){
		for(int j=1;j<=mm;j++){//枚举出符合答案的i,j
			if(i*j==k){
				sc(i,j);
				return 0;
			}
		}
	}
	cout<<"Impossible";
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...