2024.ZCPC.M题 计算三角形个数

题目描述:

小蔡有一张三角形的格子纸,上面有一个大三角形。这个边长为 的大三角形, 被分成 个边长为 1 的小三角形(如图一所示)。现在,小蔡选择了一条水平边 删除(如图二所示),请你找出图上剩余三角形的数量为多少。

这道题的算法知识点对应的是c++的高精度,但是我是比较懒的,直接用python写了,python是不会有高精度的问题的,唯一的缺点就是运行速度慢

思路:

之后就是算删边以后剩余三角形的数量

删上三角:

右端点的可能有两种,把右端点定住,左边三种,然后又两种就是 2 * 3,规律已找到

删下三角的话因为有限制,我们只能从1,n-x(这个代码三角形边长)来枚举,然后看1,n-x影响了多少三角形,每次减去就行

代码如下:

py代码:

# -*- coding: utf-8 -*-
n = int(input())
x,y = map(int,input().split())
ans = 0
d = {}
l = {}
l[1] = 1
d[1] = 0
d[2] = 1
for i in range(2,n+1):
    l[i] = l[i-1] + i * (i + 1) // 2
for i in range(3,n+1):
    d[i] = i * (i - 1) // 2 + d[i-2]
ans += d[n] + l[n] - 1
print("全部三角形个数:{}".format(ans))
ans -= y * (x - y + 1)
left,right = 0,0
for i in range(1,n - x + 1):
    left = max(1,y - i +1)
    right = min(y,x - i + 1)
    if left > right:
        break
    ans -= right - left + 1
print("最终三角形个数:{}".format(ans))

c++代码:

#include <iostream>
using namespace std;

int main() {
    int m = 849586, row = 233333, col = 123456;
    int64_t up = 0, down = 0;

    // 计算小三角形的上半部分
    for (int i = 1; i <= m; i++) {
        // i 代表小三角的边长
        up += (int64_t)i * (i + 1) / 2;
    }

    // 计算小三角形的下半部分
    for (int i = 1; m - i * 2 + 1 > 1; i++) {
        // i 代表小三角的边长
        // 删除的上三角计算方法:
        // 看看哪些三角形,底边是包含这条删除线段的
        // 底边左端点的可能性有 col 个,右端点的可能性有 row - col + 1 个
        // 两者相乘就是答案
        down +=(int64_t)(1+m-i*2+1)*(m-i*2+1)/2;

        // 计算删除的下三角形

    }
	int64_t removeUp = (int64_t)col * (row - col + 1);
    int64_t removeDown = 0;
    for (int j = 1; m - row - j >= 0; j++) {
        int left = max(col - j + 1, 1);
        int right = min(col, row - j + 1);
        if (left > right) break;
        removeDown += right - left + 1;
    }

        // 输出结果
    cout << up + down - removeUp - removeDown << endl;
    return 0;
}

加油

  • 13
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值