CodeVS 2226/BZOJ 1800-飞行棋
Posted HAdolf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeVS 2226/BZOJ 1800-飞行棋相关的知识,希望对你有一定的参考价值。
原题
时间限制: 10 Sec 内存限制: 64 MB
题目描述
给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列。 请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形。
输入
第一行为正整数N,表示点的个数,接下来N行分别为这N个点所分割的各个圆弧长度
输出
所构成不重复矩形的个数
样例输入
8
1
2
2
3
1
1
3
3
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-飞行棋的主要内容,如果未能解决你的问题,请参考以下文章