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