求点赞 收藏 关注哈 更多算法题更新中
题目描述从前有个村庄,村民们喜欢在各种田地上插上小旗子,旗子上标识了各种不同的数字。某天集体村民决定将覆盖相同数字的最小矩阵形的土地分配给村里做出巨大贡献的村民,请问此次分配土地,做出贡献的村民种最大会分配多大面积?输入描述第一行输入 m 和 n,m 代表村子的土地的长n 代表土地的宽第二行开始输入地图上的具体标识输出描述此次分配土地,做出贡献的村民种最大会分配多大面积备注旗子上的数字为1~500,土地边长不超过500未插旗子的土地用0标识用例1输入3 31 0 10 0 00 1 0输出9说明土地上的旗子为1,其坐标分别为(0,0),(2,1)以及(0,2),为了覆盖所有旗子,矩阵需要覆盖的横坐标为0和2,纵坐标为0和2,所以面积为9,即(2-0+1)*(2-0+1)= 9用例2输入3 31 0 20 0 00 3 4输出1说明由于不存在成对的小旗子,故而返回1,即一块土地的面积。Javaimport 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;}
点赞 2
评论 2
全部评论

相关推荐

不愿透露姓名的神秘牛友
05-29 22:21
Offer1:小马智行,深圳,测试开发工程师,17.0k*16.0,Offer2:追觅科技,深圳,嵌入式工程师,18.0k*15.0,
嵌软狗都不学:各位base深圳的同事,作为也是并肩作战的一员,今天想站在管理视角,和大家开诚布公地聊一聊:从近几个月的上下班数据对比看来,我们发现一个明显的差异:深圳同事的在岗时间普遍比苏州同事短。很多深圳同事早上9点之后才到公司,晚上不到 20 点就下班了;而总部那边,20点半甚至 22 点后还有不少同事在办公室忙碌,特别是研发团队,加班更是常态。相信去过苏州的同事,对这种场景都不陌生。我很好奇,这是因为苏州工作任务太重还是咱们深圳同事效率真的高到能在更短时间内完成工作?MOVA在深圳成立分公司是为了吸引更优秀的人才贡献更多更高质的价值,公司管理层给我反馈的是深圳招到的多是行业的专家大拿,大部分都是薪资比苏州高的,而且我们办公的租金等也远高于苏州的..MOVA虽脱胎于强壮的集团母体不久,各业务板块尚未实现全面盈利,虽说公司管理层目光长远,不纠结当下的人才投入,但行业内的普遍标准是,员工创造的价值要达到公司雇佣成本的 15 倍以上。大家不妨自我审视一下,自己是否达到了这个标准?如果是抱着划水、按时打卡走人拿毛爷爷的心态那不适合来MOVA,那样过下去不但自己过得尴尬也会影响MOVA这个大船的攻城略地的速度.我并非鼓励大家盲目加班,而是倡导高效工作,拒绝无效忙碌,不要让项目进度因低效受影响,也别把精力浪费在和苏州同事拼打卡时长上,提倡更高的人效比;考虑到两地地域和交通差异,相信大家会找最适合自己发挥的工作方式(比如按时下班后1小时到家晚饭后继续未竟工作等..)大家在遵守公司规章的情况下尽情地体现自己的能力价值,为MOV!和深圳公司争光我们在这边才能更安心更有信心的工作下去;请客BU长、名部门长、项目管理和各业务单元负责人,全面梳理团队情况,及时评估成员工作负荷与成果质量,坚决清退划水害虫痕疫,践行公司价值观,相互监督,防止管理漏洞及渎职。感谢人家的理解,也请人家多担待我的直言不讳……
点赞 评论 收藏
分享
喜欢疯狂星期四的猫头鹰在研究求职打法:短作业优先
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务