20200525【建设银行】建信金融科技实习生笔试卷L

题型:行政能力+专业基础+1道编程题

  1. 言语理解

  2. 数学关系

  3. 逻辑推理

  4. 资料分析

  5. 基础知识
    包括java,数据结构,算法,排序,时间复杂度、数据库…

  6. 复合知识

  7. 编程
    题目大概意思就是:有m行n列的矩阵格子,小明准备向里边放置补给包,格子拥有补给包需满足以下条件之一:
    (1)补给包丢在格子内;
    20200525【建设银行】建信金融科技实习生笔试卷L_第1张图片
    如上图在3*3的格子里,这时需要9个补给包才能覆盖所有格子

    (2)补给包丢在格子边框;
    20200525【建设银行】建信金融科技实习生笔试卷L_第2张图片
    如上图在3*3的格子里,这时只需要6个补给包就能覆盖所有格子

    (3)补给包丢在十字交叉点
    20200525【建设银行】建信金融科技实习生笔试卷L_第3张图片
    如上图在3*3的格子里,这时只需要4个补给包就能覆盖所有格子

    求解放置的最小供给包总数

    思路

    1. 使用贪心算法,先找到格子内有几个2*2的格子,使其满足一个补给包就能补充4个格子补给。
      20200525【建设银行】建信金融科技实习生笔试卷L_第4张图片

    2. 然后再剩余未被补给的格子中寻找1 * 2和2 * 1格子的个数。需要注意的是如果剩余格子数为奇数,直接将格子数除2,会漏掉补给总数,所以需要将其加1,此外横向和纵向会有一个格子重复,需将横向或纵向格子数减1
      20200525【建设银行】建信金融科技实习生笔试卷L_第5张图片(点和横线竖线表示供给包放置位置,×表示已有供给包)

      所以如图3*3格子最小补给数为4

代码(python):

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

import sys
for line in sys.stdin:
    a = line.split()
    n = int(a[0])
    m = int(a[1])

    result = (n//2)*(m//2)
    left = (m - m//2*2)*(n-1)
    if left%2 !=0:
        left += 1

    right = (n - n//2*2)*m
    if right%2 !=0:
        right += 1
    result += left//2
    result += right//2
    print(result)

你可能感兴趣的:(笔试面经)