0
点赞
收藏
分享

微信扫一扫

BZOJ 1800: [Ahoi2009]fly 飞行棋 这么小的数据。。O(n^2)

逸省 2022-09-15 阅读 166


题目描述


给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列。请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形。


输入


第一行为正整数N,表示点的个数,接下来N行分别为这N个点所分割的各个圆弧长度


输出


所构成不重复矩形的个数


样例输入


8
1
2
2
3
1
1
3
3


样例输出


3


提示

N<= 20

 

 

n才20呀,这么小,内存要求、时间要求都不重要,怎么都行。

那么一般的想法就是求出直径的条数,因为两条直径构成一个矩形,所以X条构成X*(X-1)/2个矩形。

那么求出直径的方法也很简单,直径平分一个圆嘛,只需要计算连续弧的和是否是总和的一半

然后统计一下就行了。

程序部分语句可能不太精准,但是这题乱搞就行了。没多想。


var n,i,j,d,sum,sum1:longint;
a,f:array[0..1000000] of longint;
begin
readln(n);
sum:=0;
for i:=1 to n do
begin
read(a[i]);
sum:=sum+a[i];
end;
if sum mod 2=1 then
begin
writeln('0');
halt;
end;
sum:=sum div 2;
for i:=1 to n do
begin
sum1:=0;
for j:=i to 2*n do
begin
sum1:=sum1+a[(j-1) mod n+1];
if sum1=sum then
begin
inc(d);
break;
end;
end;
end;
d:=d div 2;
writeln(d*(d-1) div 2);
end.


举报

相关推荐

0 条评论