360笔试第一题,本地编译没问题,提交AC为0,哭,求大神

import sys
import numpy as np
##读取第一行n,m
line_0 = sys.stdin.readline().strip().split()
list_1 = list(line_0)
n = list_1[0]
m = list_1[1]
list2 = []
o = p = 0

##读取n*m行矩阵
for i in range(int(n)):
    a = list(sys.stdin.readline().strip().split())
    list2.append(a)
#矩阵每行最大值(左右表面积)
for i in range(int(n)):
    b = int(max(list2[i]))
    o =o + b
    
#矩阵每列最大值(前后表面积)
list3 = np.array(list2)
for j in range(int(m)):
    z = int(max(list3[:,j]))
    p += z
##上下表面积
q = int(m)*int(n)
#最终表面积
k = 2*(o+p+q)

print(k)


#360公司##笔试题目#
全部评论
找最大值干嘛呀。。 表面积只要上下左右前后扫描6次就好了,上下是固定的就不用扫描了, 每个竖条方块记录一下比上下左右高的部分就好了 tmp =[int(x) for x in input().split()]  M,N = tmp[0],tmp[1] data = [] data.append([0 for _ in range(N+2)]) for i in range(M):     tmp = []     tmp.append(0)     tmp.extend([int(x) for x in input().split()])     tmp.append(0)     data.append(tmp) data.append([0 for i in range(N+2)]) base = M*N*2 for i in range(1,M+1):     for j in range(1,N+1):         long = 0         long += max(0,data[i][j]-data[i-1][j])         long += max(0,data[i][j]-data[i+1][j])         long += max(0,data[i][j]-data[i][j-1])         long += max(0,data[i][j]-data[i][j+1])         base+=long print(base)
点赞 回复 分享
发布于 2019-08-15 21:27
思路:总的立方体个数*6 - 重叠个数*2 从左到右,从前到后的顺序考虑重叠,这样不会重复也不会漏 if __name__ == "__main__":     N, M =map(int, input().split())     loc = []     area = 0     for _ in range(N):         tmp = list(map(int, input().split()))         area += sum(tmp)         loc.append(tmp)     area *= 6     sub = 0     for i in range(N):         for j in range(M):             if loc[i][j] > 1:                 sub += (loc[i][j]-1)*2             if j > 0:                 sub += min(loc[i][j-1], loc[i][j])*2             if i > 0:                 sub += min(loc[i-1][j], loc[i][j])*2     print(area - sub)
点赞 回复 分享
发布于 2019-08-15 21:27
和我思路一样。。。
点赞 回复 分享
发布于 2019-08-15 21:11
形状会起伏,例如31123112这样的侧面积远不止3+3了
点赞 回复 分享
发布于 2019-08-15 21:13
我也是这个思路 为什么过不了
点赞 回复 分享
发布于 2019-08-15 21:22
中间凹进去就不对了
点赞 回复 分享
发布于 2019-08-15 21:24
private static int solution(int[][] data, int n, int m) {         int res = 0;         //上下面固定         res += n * m * 2;         //第一层前后左右固定         //res += 8; 我tm把它写死了 没变成下面的         res += m * 2 + n * 2;         for (int i = 0; i <n ; i++) {             for (int j = 0; j <m ; j++) {                 int the_cur = data[i][j] - 1;//除去第一层当前位置的正方体个数                 int the_left_cur = j == 0 ? 0 : data[i][j-1] - 1;//除去第一层当前位置的左边正方体个数                 int the_right_cur = j == m-1 ? 0 : data[i][j+1] - 1;//除去第一层当前位置的左边正方体个数                 int the_up_cur = i == 0 ? 0 : data[i-1][j] - 1;//除去第一层当前位置的前边正方体个数                 int the_down_cur = i == n-1 ? 0 : data[i+1][j] - 1;//除去第一层当前位置的后边正方体个数                 //当前立方体前后左右增加的表面积                 int the_left_cur_cut = the_left_cur >= the_cur ? 0 : the_cur - the_left_cur;                 int the_right_cur_cut = the_right_cur >= the_cur ? 0 : the_cur - the_right_cur;                 int the_up_cur_cut = the_up_cur >= the_cur ? 0 : the_cur - the_up_cur;                 int the_down_cur_cut = the_down_cur >= the_cur ? 0 : the_cur - the_down_cur;                 int the_real_cur_area = the_left_cur_cut + the_right_cur_cut + the_up_cur_cut + the_down_cur_cut;                 res += the_real_cur_area;             }         }         return res;     }
点赞 回复 分享
发布于 2019-08-15 21:25
写一下思路: 类似于动态规划从左上角走到左下角思路:建一张dp表,a中存每个位置的立方体的个数,dp[i][j]表示在i j位置上加入a[i][j]之后带来的面数的增加量,从左往右,从上往下遍历的话,更新dp[i][j]只用看左边和上边有没有立方体。如果a[i][j] = 0, d[i][j]=0, 如果不等于0,那么增加的面就是不考虑遮挡的面数目减去左边和上面遮挡面的两倍。将dp表里面的所有数求和就是总了
点赞 回复 分享
发布于 2019-08-15 22:14
第一题是坑,题目说1<=Aij<=100, 结果设置了Aij为0的测试用例
点赞 回复 分享
发布于 2019-08-15 22:23
我觉得可以按位置去思考,对于每一个位置grid[i][j](假设其值为v)如果v大于0,则这个i,j位置必然会为整个立体的表面积贡献一个上面和下面;然后遍历它的合法四周grid[i'][j'](假设其值为neighbor)则这个i,j位置会为整个立体的表面积贡献max(v - neighbor, 0)个侧面。时间复杂度m*n。代码如下: public static void main(String[] args)  {         int n = sc.nextInt();         int m = sc.nextInt();         int[][] grid = new int[n][m];         for(int i=0;i < n; i++){             for(int j=0; j < m; j++){                 grid[i][j]  = sc.nextInt();             }         }         int[] dx = new int[]{-1,0,1,0};         int[] dy = new int[]{0,1,0,-1};         int ans = 0;         for (int r = 0; r < n; ++r)             for (int c = 0; c < m; ++c)                 if (grid[r][c] > 0) {                     ans += 2;                     for (int k = 0; k < 4; ++k) {                         int nr = r + dx[k];                         int nc = c + dy[k];                         int nv = 0;                         if (0 <= nr && nr < n && 0 <= nc && nc < m)                             nv = grid[nr][nc];                         ans += Math.max(grid[r][c] - nv, 0);                     }                 }         System.out.println( ans );     }
点赞 回复 分享
发布于 2019-08-15 23:08
这个思路不对啊 因为中间有可能凹进去,表面积增大了 但是只算最大值是默认是个凸多面体。测试用例比较简单的话确实只能考虑到凸多面体的情况
点赞 回复 分享
发布于 2019-08-15 23:13
能用numpy么???我之前在牛客上不能用numpy, 会提示语法错误
点赞 回复 分享
发布于 2019-08-16 16:20

相关推荐

评论
点赞
6
分享
牛客网
牛客企业服务