笔试编程题汇总(3)


"""
description:
    given a (X,Y,Z), 1 <= x <= X, 1<=y<=Y, 1<=z<=Z, (x,y,z) is all integer, 
    (x,y,z) can form a triangle, give the number of triplet that satisfies the condition.
    you can give the modulus of 1000000007
example 1:
    input:
        2 3 3
    output:
        9
    (1,1,1),(1,2,2),(1,3,3),(2,1,2),(2,2,1),(2,2,2),(2,2,3),(2,3,2),(2,3,3)
"""

"""
基本思想:寻找满足三角不等式的三元组个数,本质上是一个线性规划(整数规划)问题,然而这个问题太经典了,实际上是有公式的。这里实现的是对最小的一维进行遍历,在二维平面上总结公式的做法,相当于假设不知道公式,而去总结归纳。在二维平面内,所有点减去不符合的点,剩下的就是符合的点
"""

import sys

fixed_num = int(10**9+7)

def get_once(z, xyz):
    X, Y, _=xyz
    data = [
        int((z-1)*z/2),
        int((X-z+1)*(X-z)/2),
        int((Y-z+1)*(Y-z)/2)
    ]
    return int(X*Y - data[0] - data[1] - data[2])

def get_triple_num(xyz):
    num = 0
    for z in range(xyz[2]):
        z += 1
        num += get_once(z, xyz)
    print(num)
    return num % fixed_num


def my_min(data):
    min_idx, min_data = 0, data[0]
    for idx, data_temp in enumerate(data):
        if data[idx]<min_data:
            min_idx = idx
            min_data = data_temp
    return min_idx, min_data

if __name__=="__main__":
    line = sys.stdin.readline().strip()
    x, y, z = line.split(" ")
    xyz = [int(x),int(y),int(z)]
    min_idx, min_data = my_min(xyz)
    xyz[min_idx], xyz[2] = xyz[2], xyz[min_idx]

    print(get_triple_num(xyz))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值