其他分享
首页 > 其他分享> > 给定圆上一些点求组成矩形个数

给定圆上一些点求组成矩形个数

作者:互联网

例题传送门

可以\(C_n^{4}\)暴力枚举四个点,根据前缀和计算4条边判断。

但是发现矩形的对角线是一定经过圆心的,而且任意两条直线可以组成一个矩形。

那我们\(C_n^2\)枚举点,用前缀和算出两点间圆弧距离,为圆周长一半就是直径。

最后答案是\(直径数*(直径数-1)/2\)

当然,当圆周长是奇数时无解,因为这里给出的点都是整点

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=22;
int n,sumn,ans,a[maxn],pre[maxn];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		sumn+=a[i];
		pre[i]=pre[i-1]+a[i];	
	}	
	for(int i=1;i<=n;i++)
	for(int j=i+1;j<=n;j++)
	for(int q=j+1;q<=n;q++)
	for(int w=q+1;w<=n;w++)
	{
		int a=pre[i]+pre[n]-pre[w],b=pre[j]-pre[i];
		int c=pre[q]-pre[j],d=pre[w]-pre[q];
		if(a==c&&b==d)	ans++;
	}
	cout<<ans;
	//另一种方法 
/*	for(int i=1;i<=n;i++)
	for(int j=i+1;j<=n;j++)
		if(pre[j]-pre[i]==sumn/2)	ans++;//判断直径
	cout<<(sumn%2==1?0:ans*(ans-1)/2); /*周长奇数就是0*/ 
}

标签:pre,int,点求,long,sumn,maxn,圆上,矩形
来源: https://www.cnblogs.com/iss-ue/p/12777802.html