【NOIP 模拟题】[山东多校联合模拟赛 day1 T1] 矩形计数(暴力)

20 篇文章 0 订阅
20 篇文章 0 订阅
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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值