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

被折叠的 条评论
为什么被折叠?



