华为OD机试统一考试D卷 - 分配土地

题目描述

从前有个村庄,村民们喜欢在各种田地上插上小旗子,旗子上标识了各种不同的数字。

某天集体村民决定将覆盖相同数字的最小矩阵形的土地分配给村里做出巨大贡献的村民,请问此次分配土地,做出贡献的村民种最大会分配多大面积?

输入描述

第一行输入 m 和 n,

  • m 代表村子的土地的长
  • n 代表土地的宽

第二行开始输入地图上的具体标识

输出描述

此次分配土地,做出贡献的村民种最大会分配多大面积

备注

旗子上的数字为1~500,土地边长不超过500

未插旗子的土地用0标识

用例1

输入

3 3
1 0 1
0 0 0
0 1 0

输出

9

说明

土地上的旗子为1,其坐标分别为(0,0),(2,1)以及(0,2),为了覆盖所有旗子,矩阵需要覆盖的横坐标为0和2,纵坐标为0和2,所以面积为9,即(2-0+1)*(2-0+1)= 9

用例2

输入

3 3
1 0 2
0 0 0
0 3 4


输出

1


说明

由于不存在成对的小旗子,故而返回1,即一块土地的面积。

Java

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 土地的长和宽
        int m = scanner.nextInt();
        int n = scanner.nextInt();

        // 二维数组存储土地上的标识
        int[][] land = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                land[i][j] = scanner.nextInt();
            }
        }

        // 哈希表存储每个数字的最小和最大位置
        Map<Integer, int[]> minPos = new HashMap<>();
        Map<Integer, int[]> maxPos = new HashMap<>();

        // 遍历每块土地,更新每个数字的最小和最大位置
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                int num = land[i][j];
                if (num != 0) {
                    if (!minPos.containsKey(num)) {
                        minPos.put(num, new int[]{i, j});
                        maxPos.put(num, new int[]{i, j});
                    } else {
                        minPos.get(num)[0] = Math.min(minPos.get(num)[0], i);
                        minPos.get(num)[1] = Math.min(minPos.get(num)[1], j);
                        maxPos.get(num)[0] = Math.max(maxPos.get(num)[0], i);
                        maxPos.get(num)[1] = Math.max(maxPos.get(num)[1], j);
                    }
                }
            }
        }

        // 初始化
        int maxArea = 0;

        // 遍历每个数字,计算其对应的面积,并更新最大面积
        for (Integer num : minPos.keySet()) {
            int[] min = minPos.get(num);
            int[] max = maxPos.get(num);
            int area = (max[0] - min[0] + 1) * (max[1] - min[1] + 1);
            maxArea = Math.max(maxArea, area);
        }

        // 打印最大面积
        System.out.println(maxArea);
        scanner.close();
    }
}

C++贪心

#include<bits/stdc++.h>
using namespace std;

struct ST{
	int x_l = -1;
	int x_r = 501;
	int y_h = 501;
	int y_l = -1;
	int cnt;
};

int main(){
	int m,n;
	cin>>m>>n;
	
	vector<vector<int>> mp(m,vector<int>(n));
	map<int,ST> dic;
	
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			cin>>mp[i][j];
			if(mp[i][j] == 0) continue;
			dic[mp[i][j]].cnt++;
			if(i>dic[mp[i][j]].x_r || dic[mp[i][j]].x_r == 501) dic[mp[i][j]].x_r = i;
			if(i<dic[mp[i][j]].x_l || dic[mp[i][j]].x_l == -1) dic[mp[i][j]].x_l = i;
			if(j>dic[mp[i][j]].y_h || dic[mp[i][j]].y_h == 501) dic[mp[i][j]].y_h = j;
			if(j<dic[mp[i][j]].y_l || dic[mp[i][j]].y_l == -1) dic[mp[i][j]].y_l = j;
		}
	}

	int res = 0;
	
	for(auto x:dic){
		if(x.second.cnt == 1){
			res = max(res,1);
			continue;
		}
		int chang = (x.second.x_r - x.second.x_l+1);
		int kuan = (x.second.y_h - x.second.y_l+1);
		res = max(res,chang*kuan);
	}
	cout<<res<<endl;
} 

#华为od##算法题解#
每日算法题 文章被收录于专栏

Leetcode算法题 小米 华为 算法题库讲解

全部评论
大佬
点赞 回复 分享
发布于 06-21 11:47 北京
求点赞 收藏 关注哈 更多算法题更新中
点赞 回复 分享
发布于 06-21 16:15 北京

相关推荐

具体是做大模型训练套件的中台组,所以很考察涉及大模型内部计算的细节。1.自我介绍2.手撕&nbsp;和最大的连续子序列3&nbsp;写一个多头注意力&nbsp;reshape&nbsp;transpose4&nbsp;为什么要使用多头注意力&nbsp;更多的qkv嵌入更好的表达能力5&nbsp;单头注意力和多头注意力计算量比较。多头略多一些,具体应该是多在多头注意力concat之后的又一次线性变换上。这题当时没答对。6&nbsp;为什么使用gqa,gqa的好处有啥。略微减少参数量,均衡性能并减少kv&nbsp;cache的压力。7&nbsp;为什么是kv&nbsp;cache&nbsp;而不是qv&nbsp;cache。我理解是,如果是qv&nbsp;cache,这东西能算的注意力是最后一列而不是最后一行,这种计算甚至是反因果系统这个前提的,我感觉我的解释有道理,但面试官不满意,可能有更好的答案。8&nbsp;lora具体为什么能减少计算过程中的显存占用,具体减少在那部分上了?我认为权重和前向过程中的激活值在加上lora之后,整体也不会少太多,那么少的只能是来自梯度和优化器状态,其中大头是优化器状态。9&nbsp;拷打Megatron中的张量并行都存在哪些地方,具体如何做张量并行,当时没太完全看透Megatron(虽然现在也没看透),所以这题直接爆炸了。10&nbsp;具体来说Megatron在transformers中的张量并行,可以发生在mlp,attention,embedding,cross&nbsp;entropy这几块。在mlp上,存在一个因为非线性变换,而对两个矩阵乘中的右侧矩阵列split,左侧矩阵不切的方式进行并行,减少一个同步点。attention中的并行主要是对头并行。embedding和cross&nbsp;entropy中这是要减少vocab这个超大纬度给计算带来的压力,做vocab纬度的张量并行。11&nbsp;见我Megatron&nbsp;张量并行打的不是很好,可能是想引导一下,面试官问我长文本训练中,需要算loss的token很多,怎么缓解这个过程的计算压力,我觉得他当时想引导我讲cross&nbsp;entropy的张量并行的,但我当时没想到。反问&nbsp;很套路的了解部门业务结果&nbsp;面完秒挂&nbsp;😭 #如何判断面试是否凉了# #百度求职进展汇总# #互联网没坑了,还能去哪里?#
点赞 评论 收藏
分享
2 4 评论
分享
牛客网
牛客企业服务