战役杯,第三场

1 疫情防控网格化

全屏浏览题目

切换布局

作者 吴云鹏

单位 郑州大学

由于防控形势严峻,现在z市已经开始了全区域的网格化封控管理。该市的区域可以看成一个矩形,其中所有主干道都是水平或垂直的,并且贯穿整个区域。如图所示,黑色表示城区的边界,红色表示城区的主干道,其中边界和主干道宽度都为1,且不存在边界与主干道、主干道与主干道相邻的情况

为了方便网格化管理,我们定义网格单元是由城区边界或主干道围成的区域,且任意网格单元内不能包含主干道。上图中,该城区共被分割成了16个网格单元。

现在给出该区域的地图,需要你统计出该城区划分出了多少个网格单元,以方便安排医务人员和应急物资。

在计算机中,图像的本质就是二维的矩阵。为了方便处理,我们将上述图像中城区边界及里面的内容转化为了二维字符矩阵,详细见输入格式描述。

输入格式:

第一行输入两个整数n,m(3≤n,m≤100)
其后n行,每行m个字符,字符有'*'和'#'两种。'*'代表城区边界或主干道,'#'代表网格单元内区域。

输出格式:

输出一行一个整数,代表地图中的网格单元个数。

输入样例:

3 7
*******
*##*##*
*******

输出样例:

2
#include<bits/stdc++.h>
using namespace std;
int main() {
	int n, m;
	char a[101][101];
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> a[i][j];
		}
	}
	int flag = 0;
	int flag1 = 0;
	int flag2 = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (a[i][j] == '*') {
				flag++;
			}
		}
		if (flag == m) {
			flag1++;
		}
		flag = 0;
	}
	int flag3 = 0;
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			if (a[j][i] == '*')flag3++;
		}
		if (flag3 == n) {
			flag2++;
		}
		flag3 = 0;
	}

	cout << (flag1-1)*(flag2-1);
	return 0;
}

 

2 子区域计数

全屏浏览题目

切换布局

作者 吴云鹏

单位 郑州大学

由于防控形势严峻,现在z市已经开始了全区域的网格化封控管理。该市的区域可以看成一个矩形,其中所有主干道都是水平或垂直的,并且贯穿整个区域。如图所示,黑色表示城区的边界,红色表示城区的主干道。其中边界和主干道宽度都为1,且不存在边界与主干道、主干道与主干道相邻的情况。

为了方便网格化管理,我们定义网格单元是由城区边界或主干道围成的区域,且任意网格单元内不能包含主干道。上图中,该城区共被分割成了16个网格单元。

同时,网格化管理的本质思想是“分治”,不同的划分粒度对于管理效率会产生深远的影响。所以,这次W同学思考的不仅仅是网格单元,而是子网格。

子网格的定义为:子网格也是一个矩形,且子网格矩形4个角的对应点都位于边界与边界、边界与主干道、主干道与主干道的交点上。我们认为两个子网格是相同的,当且仅当两个子网格的4个角对应点全部重合。根据这个定义,我们可以知道,任意的网格单元也是一种子网格,整个城区的矩形也是一种特殊的子网格。

同样给出上述的图像,你能否帮小W计算下,有多少种可能的子网格?

输入格式:

第一行输入两个整数n,m(3≤n,m≤100)
其后n行,每行m个字符,字符有'*'和'#'两种。'*'代表城区边界或主干道,'#'代表网格单元内区域。

输出格式:

输出一行一个整数,代表符合条件不同子网格的个数。

输入样例:

3 7
*******
*##*##*
*******

输出样例:

3

 

#include<bits/stdc++.h>
using namespace std;
int main() {
	int n, m;
	char a[101][101];
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> a[i][j];
		}
	}
	int flag = 0;
	int flag1 = 0;
	int flag2 = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (a[i][j] == '*') {
				flag++;
			}
		}
		if (flag == m) {
			flag1++;
		}
		flag = 0;
	}
	int flag3 = 0;
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			if (a[j][i] == '*')flag3++;
		}
		if (flag3 == n) {
			flag2++;
		}
		flag3 = 0;
	}
	int nn, mm;
	nn = flag1 - 1;
	mm = flag2 - 1;
	int ff = 0;
	int f = 0;
	for (int i = 1; i <= mm; i++) {
		for (int r = i; r <= mm; r++) {
			for (int j = 1; j <= nn; j++) {
				ff += j;
			}
		}
	}
	cout << ff;
	return 0;
}

3 怀旧的思考挑战

全屏浏览题目

切换布局

作者 吴云鹏

单位 郑州大学

疫情来了,柴刘青山在寝室关着非常无聊,和室友一起玩跑跑卡丁车这款老游戏。

这款游戏有一个模式叫做组队竞速,每局8个人,分为两队,最终比拼哪队总分更高。

第一名冲线得到8分,第二名得到7分,以此类推,第八名得到1分。

柴刘青山好奇自己队伍在某一局游戏中是否能得到某个总分,如果可以,有多少种排名情况可以达成该总分?

后记:柴刘青山和室友们寻求过短暂的放松后,决定还是在学业上开启“竞速模式”,约定共同努力学习,参加“战疫杯”!

输入格式:

第一行一个正整数n,表示猜想的n总分。 0≤n≤10000

输出格式:

如果可以达成,输出一个正整数x,代表有多少种排名情况。
如果不能达成,输出NO。

输入样例:

25

输出样例:

1

样例解释1

柴刘青山的队伍需要取得1、2、3、5名,对应8+7+6+4=25。有且仅有这一种情况。

#include<bits/stdc++.h>
using namespace std;
int main() {
	int n;
	cin >> n;
	int flag = 0;
	int ff = 1;
	if (n <= 26) {
		for (int i = 1; i <= 5; i++) {
			for (int j = i+1; j <= 6; j++) {
					for (int r = j+1; r <= 7; r++) {
							for (int f = r+1; f <= 8; f++) {
									if ((i + j + r + f) == n) {
										flag++;
									}
							}
					}
			}
		}
	}
    if(flag>0)
	cout << flag;
    else
        cout<<"NO";
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值