bzoj1800飞行棋

题目链接

简单模拟

真的不敢相信ahoi09年的题竟然是这个难度

首先,一个必须要知道的定理是:圆上只有直径所对的圆周角是直角。

然后就很显然了,

只有两条不重合的直径上的四个点才能组成一个矩形,

所以统计有多少条直径,答案就是$\frac{n(n-1)}{2}$

直径的话,就意味着左半边长度$=$右半边的长度$=$ $\frac{\text{周长}}{2}$

首先,当圆周长是奇数的时候,显然正整数内不存在任何一条直径。

对于周长是偶数

那么怎么统计有多少条直径呢?

维护一个前缀和就好了啊$……$

上代码:

/**************************************************************
    Problem: 1800
    User: zhangheran
    Language: C++
    Result: Accepted
    Time:76 ms
    Memory:1288 kb
****************************************************************/
 
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
int a[25];
int sum[25];
int calc(int xx){return xx*(xx-1)/2;} 
int num;int rp;
int main()
{
//  freopen("1.in","r",stdin);
//  freopen("1.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i];
    if(sum[n]%2||sum[n]<=0){puts("0");return 0;}
    for(int i=1;i<=n;i++)
      for(int j=i+1;j<=n;j++)
        if(sum[j]-sum[i]==sum[n]/2) num++;
    printf("%d",calc(num));
    return 0;
}
/*
 
7
19
16
14
2
4
12
3
 
*/

 

posted @ 2018-07-25 21:47  米罗偕涯  阅读(306)  评论(0编辑  收藏  举报