给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列。 请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形。
.
发现数据范围很小, 首先就想到 枚举端点, 然后检查关于直径对称的对应端点是否存在,
但是发现这样去作关于直径对称的线段很麻烦, 作罢 .
矩形的四个角都为直角, 而直角所对弦长为直径, 直径所对弧长为周长的一半,
所以满足条件的矩形的对角线就对应直径, 于是考虑 枚举 对角线, 使用对角线去 矩形 .
于是枚举 两个端点, 判断其距离 是否满足 , 若满足, 则说明发现了一条新的对角线.
最后得到对角线的个数为 个, 取出其中 个构成一个矩形, 则答案为 .
时间复杂度 .
- 注意圆的周长可能是奇数 .
#include<bits/stdc++.h>
#define reg register
const int maxn = 25;
int N;
int d;
int cnt;
int A[maxn];
int main(){
scanf("%d", &N);
for(reg int i = 1; i <= N; i ++) scanf("%d", &A[i]), d += A[i], A[i] += A[i-1];
for(reg int i = 1; i <= N; i ++)
for(reg int j = i+1; j <= N; j ++)
if((abs(A[i]-A[j])<<1) == d) cnt ++;
printf("%d
", cnt*(cnt-1)>>1);
return 0;
}