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

题目描述

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

输入

第一行为正整数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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值