BZOJ 1800 [Ahoi2009]fly 飞行棋
1800: [Ahoi2009]fly 飞行棋
Description
给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列。 请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形。
Input
第一行为正整数N,表示点的个数,接下来N行分别为这N个点所分割的各个圆弧长度
Output
所构成不重复矩形的个数
Sample Input
8
1
2
2
3
1
1
3
3
1
2
2
3
1
1
3
3
Sample Output
3
HINT
N<= 20
明显只需要数直径。直径即弧长为半圆周,可以参考求对“重”点对的方法。加上前缀和。
1 /************************************************************** 2 Problem: 1800 3 User: Doggu 4 Language: C++ 5 Result: Accepted 6 Time:16 ms 7 Memory:820 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 const long long MOD = 100003; 12 int n, sum[25], jin = 1, tot = 0; 13 int main() { 14 scanf( "%d", &n ); 15 for( int i = 1; i <= n; i++ ) scanf("%d",&sum[i]),sum[i]+=sum[i-1]; 16 for( int i = 1; i <= n; i++ ) { 17 if(sum[i]-sum[jin]<sum[n]/2) continue; 18 for( ; jin<i; jin++ ) { 19 if(sum[i]-sum[jin]==sum[n]/2) {tot++;break;} 20 if(sum[i]-sum[jin]<sum[n]/2) {jin--;break;} 21 } 22 } 23 printf( "%d\n", tot*(tot-1)/2 ); 24 return 0; 25 } 26