题目描述:
小蔡有一张三角形的格子纸,上面有一个大三角形。这个边长为 的大三角形, 被分成 个边长为 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;
}
加油