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
 
*/

 

转载于:https://www.cnblogs.com/cn-suqingnian/p/9368527.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值