CodeVS 2226/BZOJ 1800-飞行棋

原题

时间限制: 10 Sec  内存限制: 64 MB

题目描述

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

输入

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

输出

所构成不重复矩形的个数

样例输入

8
1
2
2
3
1
1
3
3


样例输出

3

提示

N<= 20

题意

给出圆上n个点之间的距离,求将所有点一一相连后能组成多少个矩形。

题解

BZ千年一遇的大水题呀。。。虽然在CodeVS上提交时惨WA了一次【逃

先读入点i与点i+1的距离,然后算出圆的周长sum【这个以后会有用的

然后二重大暴力算出所有点两两之间(i,j;i<j)的距离。

然后四重枚举四边形的四个顶点,算出答案,完了。

piapiapia代码:

 1 uses math;
 2 var a:array[0..110,0..110] of longint;
 3 var n,i,j,k,l,ans,x,sum:longint;
 4 begin
 5   readln(n);
 6   for i:=1 to n do
 7   begin
 8     readln(x);
 9     a[i,i+1]:=x;//点i与点i+1之间的距离x
10     sum:=sum+x;//求圆周长
11   end;
12   for i:=1 to n do
13   for j:=i+2 to n do
14   a[i,j]:=a[j-1,j]+a[i,j-1];//圆上点两两之间的距离,i+1已知所以不枚举
15   for i:=1 to n do//顶点1
16   for j:=i+1 to n do//顶点2
17   for k:=j+1 to n do//顶点3
18   for l:=k+1 to n do//顶点4
19   if (a[i,j]=a[k,l])and(a[j,k]=sum-a[i,l]) then inc(ans);//两对对边分别相等则inc(ans),注意第4条边要用周长减去前3边的长度总和,因为a[l,i]不可取
20   writeln(ans);
21 end.
CodeVS 2226/BZOJ 1800-飞行棋
原文地址:https://www.cnblogs.com/HAdolf-HQY/p/6346848.html