构建三角形

文章描述了一道编程问题,涉及如何在正N边形的特定边分布的特殊点上构建最多数量的非相交三角形,满足一定条件。解题方法是找出最大特殊点数,判断是否能用其他边的点补足,以满足总点数除以三的规律。

在你的手上有一个正N边型的图形,这个正N边型的各条边的编号分别为1,2,3……N。在第i条边上,有Ai个特殊点将第i条边按长度平均分为Ai-1份。

举个例子,假设现在一个正N边型的图形

在这个图中,A=[3,1,4,6],最上边这条边的编号为1。

此时,你需要构建出尽可能多的非相交三角形出来。这些非相交三角形需满足以下几个条件:

  • 三角形的任意一个顶点必须是某条边上的特殊点之一
  • 任意两个三角形之间不能有相交的部分
  • 一个特殊点最多只能成为一个三角形的顶点之一,不能重复使用

现在,给你这个正N边型的相关数据,请你计算出,这个正N边型最多可以构建出多少个满足条件的三角形。

输入格式

第一行输入一个数字N,表示正多边形的边数

接下来输入N个数字,表示这个正N边型的每条边上特殊点的个数

输出格式

输出一个数字,表示这个正N边型最多可以构建的三角形数量。

样例

4 3 1 4 6

样例输入

4
3 1 4 6

样例输出

4

这是一道数学题,其实就是找到规律就可以解出这道题了。

其实不难发现,这道题的大部分答案其实就是所有的点数除以三,其实就是当做三个顶点分配给三角形,虽然说这样只有50分(别问我怎么知道的)

比如说以下输入:

5

1 2 100000000 4 5

这时,按之前的规律来说,输出应该是:33333337(向下取整)

所以我们得找在那种情况下满足这种规律,想一想,是不是得先找出最大值,然后判断除最大值之外所有点数之和是不是大于等于最大值的一半,这样就能通过消耗其它边一个点,点数最多边两个点来构建三角形,在这个时候,就满足总和除以三的规律

如果总和小于了最大值的一半,那么就说明在这种情况下,不管怎么组合三角形,都是不可能把最大值那条边的点用完的,所以当前可组成的三角形个数就是剩余点的总和数

代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int a[N],n,mx,s;
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		mx=max(mx,a[i]);
		s+=a[i];
	}
	if((s-mx)*2>=mx)printf("%lld",s/3);
	else printf("%lld",s-mx);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值