列表

详情


NC207451. 地理学带师

描述

小昌最近研究起了地理知识。他认为在一张图中,那些顶峰点和低谷点是最有研究价值的地方,一张图的顶峰点和低谷点往往也能反映出一块区域的地貌特性。

    我们不妨将一张图抽象成一个的二维矩阵(n代表行数,m代表列数).这个矩阵上的每个点有一个值.代表着它的地势高度。以 上北 下南 左西 右东 定义这张图的方向.

现在我们定义这个二维矩阵中的顶峰点和低谷点:(注意,不用考虑矩阵之外的点)

顶峰点: 站在这个点上往东西南北四个方向看去,其他所有点的地势均严格低于该点的点。

低谷点:站在这个点上往东西南北四个方向看去,其他所有点的地势均严格高于该点的点.

例如下图二维矩阵中的(3, 3)矩阵即为顶峰点。

往北看去地势高度依次是:1,3

往南看去地势高度依次是:4,1

往西看去地势高度依次是:3,4

往东看去地势高度依次是:1,2

显然,它们的高度都比5要小,所以这个点是顶峰点.(低谷点同理)

现在给你这个二维矩阵,小昌想问你,这张图里有多少个顶峰点,多少个低谷点?

输入描述

第一行为两个整数n , m 代表着这个矩阵的行数和列数 ()

接下来n行,每行m个整数. 第i行第j个数 对应的表示这个矩阵第i 行 第 j 列的点的地势.  ()

输出描述

输出两行整数,第一行整数代表这个二维矩阵中顶峰点的个数,

第二行整数代表这个二维矩阵中低谷点的个数.

示例1

输入:

3 3
1 3 4
3 5 3
7 4 4

输出:

2
1

说明:

解释:(注意,二元组的第一维代表行号,第二维代表列号)

顶峰点有两个: 分别位于位置(2 , 2) , 位置(3 , 1)

低谷点有一个:位于位置(1,1).

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 12ms, 内存消耗: 432K, 提交时间: 2020-06-14 16:45:20

#include<iostream>
#include<stdio.h>
using namespace std;

int max1=0,min1=0;
int n,m;
int map[105][105];

int find(int a,int b,int n,int m)
{
	int pow1=0,pow2=0;
	for(int i=0;i<m;i++)
	{
		if(i!=b){
		if(map[a][b]>map[a][i]) pow1++;
		else if(map[a][b]<map[a][i]) pow2++; 	
		}
	}
	for(int j=0;j<n;j++)
	{
		if(j!=a){
		if(map[a][b]>map[j][b]) pow1++;
		else if(map[a][b]<map[j][b]) pow2++;	
		} 
	}
	if(pow1==n+m-2) max1++;
	if(pow2==n+m-2) min1++;
}
int main()
{
	cin>>n>>m;
	
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
		{
			cin>>map[i][j];
		}
		
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			find(i,j,n,m);
	 
	cout<<max1<<endl;
	cout<<min1<<endl;
	
	return 0;
 } 

C++11(clang++ 3.9) 解法, 执行用时: 13ms, 内存消耗: 500K, 提交时间: 2020-06-14 14:52:34

#include<bits/stdc++.h> 
using namespace std;
int a[101][105];
int main(){
	int n,m,ans1=0,ans2=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++)
		cin>>a[i][j];
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			int t1=0,t2=0,t3=0,t4=0;
			for(int k=1;k<=n;k++){
			if(a[i][j]>a[k][j])
			t1++; 
			if(a[i][j]<a[k][j])
			t3++; 
			}
			for(int k=1;k<=m;k++){
			if(a[i][j]>a[i][k])
			t2++; 
			if(a[i][j]<a[i][k])
			t4++; 
			}
			if(t1==n-1&&t2==m-1){
				ans1++;
			}
			if(t3==n-1&&t4==m-1){
				ans2++;
			}
		}		
	}
		
	cout<<ans1<<endl;
	cout<<ans2<<endl;
	return 0;
}

pypy3(pypy3.6.1) 解法, 执行用时: 173ms, 内存消耗: 26316K, 提交时间: 2020-06-14 16:02:31

n, m = map(int, input().split())
a = [[int(j) for j in input().split()] for i in range(n)]
x = 0
y = 0
for i in range(n):
    for j in range(m):
        if all(x < a[i][j] for x in (a[i][0:j] + a[i][j + 1:m])) and all(x  < a[i][j] for x in (b[j] for b in a[0:i])) and all(x  < a[i][j] for x in (b[j] for b in a[i + 1:n])):
            x += 1
        if all(x > a[i][j] for x in (a[i][0:j] + a[i][j + 1:m])) and all(x  > a[i][j] for x in (b[j] for b in a[0:i])) and all(x  > a[i][j] for x in (b[j] for b in a[i + 1:n])):
            y += 1
print(x)
print(y)

上一题