Codeforces 919C - Seat Arrangements
2024-09-02 14:18:42
传送门:http://codeforces.com/contest/919/problem/C
给出一张n×m的座位表(有已占座位和空座位),请选择同一行(或列)内连续的k个座位。求选择的方法数。
Hack:首先,若k=1,则所有的空座位均可选,方法数即为空座位数。
对于某一行(或列)中连续的len个座位,选择的方法数为len-k+1。
于是,分别逐行、逐列地统计,求出答案。参考程序如下:
#include <stdio.h>
#define MAX_N 2000 char map[MAX_N][MAX_N];
int row[MAX_N][MAX_N], col[MAX_N][MAX_N]; int main(void)
{
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
for (int i = ; i < n; i++) {
getchar();
for (int j = ; j < m; j++)
map[i][j] = getchar();
}
int ans = ;
if (k == ) {
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++)
if (map[i][j] == '.') ans++;
}
printf("%d\n", ans);
return ;
}
//pass by row
for (int i = ; i < n; i++) {
int len = , cnt = ;
for (int j = ; j < m; j++) {
if (map[i][j] == '*') {
if (len) row[i][cnt++] = len;
len = ;
}
else len++;
}
if (len) row[i][cnt++] = len;
}
//pass by column
for (int j = ; j < m; j++) {
int len = , cnt = ;
for (int i = ; i < n; i++) {
if (map[i][j] == '*') {
if (len) col[j][cnt++] = len;
len = ;
}
else len++;
}
if (len) col[j][cnt++] = len;
}
for (int i = ; i < n; i++) {
for (int j = ; row[i][j] != ; j++)
if (row[i][j] >= k) ans += row[i][j] - k + ;
}
for (int i = ; i < m; i++) {
for (int j = ; col[i][j] != ; j++)
if (col[i][j] >= k) ans += col[i][j] - k + ;
}
printf("%d\n", ans);
return ;
}
最新文章
- IDDD 实现领域驱动设计-理解限界上下文
- 引用模板中的类型时,切记要加上typename声明!!
- 获取乌云补天指定关键字的漏洞并输出URL和标题
- 常用Windows DOS命令项目部署经常用到
- 温故而知新----stack
- ykit入门
- 4、Kafka命令行操作
- kubernetes 部署 traefik 以及kubernetes dashborad
- 4. Oracle数据库用户管理备份与恢复
- 学习笔记<;3>;View接触
- PriorityQueue的Java实现
- 关于cocos2dx的textfield事件响应
- UITableView的headerView展开缩放动画
- spring拾遗(一)——@Value注入static属性
- 小程序插入html代码
- 2017 Multi-University Training Contest - Team 3 hdu6060 RXD and dividing
- Backup--备份相关的信息查看及小技巧
- el表达式动态拼接变量_c:set的用法
- quagga源码学习--BGP协议中的routemap
- CRM IFD 部署在同一台服务器上遇到的错误