1.矩形计数(rect.cpp/c/pas)
【问题描述】给出圆周上的 N 个点,请你计算出以这些点中的任意四个为四个角,能构成多少个矩形。
点的坐标是这样描述的,给定一个数组v[1..N],假设圆心为(0,0),圆的周长 C=∑v[1..N] ,第一个点坐标为(0,C/(2π))。从第一个点开始,顺时针沿圆周走v1个单位长度,此时坐标为第二个点的坐标,再走v2个单位长度,此时为第三个点的坐标,当走完v1,v2..vi个距离后,为第 i+1 个点的坐标(全过程都是沿圆周顺时针)。特别的,走完v1,v2..vn个距离后,就会回到第一个点。
【输入】
输入文件名为 rect.in。
输入共 N+1 行。
第一行为正整数 N。接下来 N 行每行一个正整数。其中第i+1行表示的是 v[i]。
【输出】
输出文件名为 rect.out。
输出共 1 行,一个整数,表示能构成的矩形的个数。
【输入输出样例说明】
【数据范围】
对于 100%的数据,有 N<=20,V 数组中的所有元素的值<=100。
——————————————————————————————————
【题解】【暴力】
【这道题,实际非常简单。千万不要被题面骗了,跑去算每个点的坐标,然后、然后。。。(估计等算出坐标也就没有然后了)】
【因为所有的点都在圆周上,就有一个非常好的性质:直径所对的圆周角为直角。所以说,每个矩形的对角线都是矩形的直径,这样一来,四个角都是直角的四边形当然就是矩形了。只需再考虑四个点不重合即可】
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int sum[30],v[30],n,len;
int a[30][30],f[30],ans;
bool p[30][30];
int main()
{
freopen("rect.in","r",stdin);
freopen("rect.out","w",stdout);
int i,j;
scanf("%d",&n);
for(i=1;i<=n;++i) scanf("%d",&v[i]),len+=v[i],sum[i+1]=sum[i]+v[i];
if(len%2) {printf("0\n"); return 0;}
len/=2;
for(i=1;i<n;++i)
for(j=i+1;j<=n;++j)
{
int x=sum[j]-sum[i];
a[i][j]=a[j][i]=x;
if(x==len) f[i]=j,f[j]=i;
}
for(i=1;i<n;++i)
for(j=i+1;j<=n;++j)
if(f[i]&&f[j]&&!p[i][j]&&!p[j][i]&&!p[f[i]][f[j]]&&!p[f[j]][f[i]])
if(a[i][j]==a[f[i]][f[j]]&&f[i]!=j&&f[j]!=i)
{
ans++;
p[i][j]=p[j][i]=1;
p[f[i]][f[j]]=p[f[j]][f[i]]=1;
}
printf("%d\n",ans);
return 0;
}