查看题目 Show Problem
题目:矩形计数
问题编号:698
题目描述
给出圆周上的N个点,请你计算出以这些点中的任意四个为四个角,能构成多少个矩形。
点的坐标是这样描述的,给定一个数组v[1..N],假设圆心为(0,0),圆的周长C=∑v[1..N] ,第一个点坐标为(0,C/(2π))。从第一个点开始,顺时针沿圆周走v1个单位长度,此时坐标为第二个点的坐标,再走v2个单位长度,此时为第三个点的坐标,当走完v1,v2..vi个距离后,为第i+1个点的坐标(全过程都是沿圆周顺时针)。特别的,走完v1,v2..vn个距离后,就会回到第一个点。
对于100%的数据,有N<=20,V数组中的所有元素的值<=100。
输入格式
输入共N+1行。
第一行为正整数N。
接下来N行每行一个正整数。其中第i+1行表示的是v[i]。
输出格式
输出共1行,一个整数,表示能构成的矩形的个数。
样例输入
8
1
2
2
3
1
1
3
3
样例输出
3
//样例解释[img]http://www.rqnoj.cn/ProblemPic/P698-101656.png[/img]
观察图片,易发现圆内的内接矩形对角线交点必过圆心(初中证明……)
所以只要找到所有对角线就行了
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#include<cmath>
#include<cstdlib>
using namespace std;
#define MAXN (100+10)
int n,c=0,m=0,a[MAXN];
int main()
{
scanf("%d",&n);
a[1]=0;
for (int i=2;i<=n;i++)
{
scanf("%d",&a[i]),c+=a[i];
if (!a[i]) i--,n--;
else a[i]=c;
}
int p;
scanf("%d",&p);c+=p;
int l=1,r=1;
while (r<=n&&l<=n)
{
if (a[r]-a[l]==c/2) {/*cout<<l<<' '<<r<<endl;*/m++;l++;}
else if (a[r]-a[l]<c/2) r++;
else l++;
}
cout<<m*(m-1)/2<<endl;
return 0;
}