^m
路漫漫

1800: [Ahoi2009]fly 飞行棋

Time Limit: 10 Sec  Memory Limit: 64 MB

Description

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

Input

第一行为正整数N,表示点的个数,接下来N行分别为这N个点所分割的各个圆弧长度

Output

所构成不重复矩形的个数

Sample Input

8

1

2

2

3

1

1

3

3





Sample Output

3

HINT

N<= 20

Source

题目链接

 

判断每个点对面位置是否有点并统计个数,

任选两对点可构成矩形

复杂度 O ( n ^ 2 )

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<vector>
 7  
 8 using namespace std;
 9 
10 template <typename tn> void read (tn & a) {
11     tn x = 0, f = 1;
12     char c = getchar();
13     while (c < '0' || c > '9'){ if (c == '-') f = -1; c = getchar(); }
14     while (c >= '0' && c <= '9'){ x = x * 10 + c - '0'; c = getchar(); }
15     a = f == 1 ? x : -x;
16 }
17 
18 int n;
19 const int MAXN = 30;
20 int d[MAXN];
21 
22 int main() {
23     read(n);
24     for (int i = 1; i <= n; ++i) {
25         read(d[i]);
26         d[i] += d[i - 1];
27     }
28     int x = 0;
29     for (int i = 1; i <= n; ++i) {
30         for (int j = i + 1; j <= n; ++j) {
31             if (d[j] + d[j] - d[i] - d[i] == d[n]) {
32                 ++x;
33             }
34         }
35     }
36     x = x * (x - 1) / 2;
37     cout << x << "\n";
38     return 0;
39 } 
View Code

 

posted on 2018-04-23 22:47  ^m  阅读(109)  评论(0编辑  收藏  举报