构建三角形

在你的手上有一个正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);
}

posted on 2024-02-18 21:02  fish2012  阅读(4)  评论(0)    收藏  举报  来源