P3654 First Step (ファーストステップ)(贪心算法)

cpp 复制代码
#include<bits/stdc++.h> 
using namespace std;

int main() {
	int r,c,k;
	cin>>r>>c>>k;
	char a[105][105];
	int ans=0;
	
	for(int i=0;i<r;i++){
		for(int j=0;j<c;j++){
			cin>>a[i][j];
		}
	}
	
	for(int i=0;i<r;i++){
		int cnt=0; // 用来记录连续空地的数量
		for(int j=0;j<c;j++){
			if(a[i][j]=='.'){
				cnt++; // 如果是空地,连续空地计数增加
			} else{
				if(cnt>=k) ans+=cnt-k+1;// 连续空地数大于等于 K 时,可以放置队员
				cnt=0; // 重置连续空地计数
			}
		}
		if(cnt>=k){ // 行末还有连续空地的情况,需要处理
			ans+=cnt-k+1;
		}
	}
	
	for(int j=0;j<c;j++){
		int cnt=0;
		for(int i=0;i<r;i++){
			if(a[i][j]=='.'){
				cnt++;
			} else{
				if(cnt>=k) ans+=cnt-k+1;
				cnt=0;
			}
		}
		if(cnt>=k) ans+=cnt-k+1;
	}
	if(k==1) ans/=2;// 如果 K == 1,则需要除以 2,因为每个空地计算了两次
	cout<<ans;
	
}

水平扫描(按行)

  • 对每一行进行扫描,累积每段连续的空地数量。
  • 当遇到杂物(#)时,检查当前空地段的长度 cnt 是否大于等于 k,如果满足条件,则可以放置队员,且可以从中选 cnt - k + 1 个位置。
  • 对每行扫描完后,检查该行末尾是否存在连续的空地段(例如 ...),并更新答案。

垂直扫描(按列):

  • 对每一列进行类似的操作,累积连续空地并检查可行的站位方式。

注意: 如果 k == 1,则每个空地点都会被统计两次。因此,最终答案需要除以 2。

相关推荐
FrankHuang8885 分钟前
使用高斯朴素贝叶斯算法对鸢尾花数据集进行分类
算法·机器学习·ai·分类
菠萝015 分钟前
共识算法Raft系列(1)——什么是Raft?
c++·后端·算法·区块链·共识算法
海棠蚀omo11 分钟前
C++笔记-C++11(一)
开发语言·c++·笔记
武子康20 分钟前
AI炼丹日志-28 - Audiblez 将你的电子书epub转换为音频mp3 做有声书
人工智能·爬虫·gpt·算法·机器学习·ai·音视频
闪电麦坤951 小时前
数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)
数据结构·算法
凌佚1 小时前
rknn优化教程(一)
c++·目标检测·性能优化
suuijbd3 小时前
个人总结八股文之-基础篇(持续更新)
算法
2401_881244403 小时前
斐波那契数列------矩阵幂法
线性代数·算法·矩阵
机器学习与统计学3 小时前
阿里牛逼,又开源两个遥遥领先的模型(向量化、重排),知识库要翻天地覆了
算法
小河豚oO3 小时前
LeetCode刷题---贪心算法---944
算法·leetcode·贪心算法