1800: [Ahoi2009]fly 飞行棋
Time Limit: 10 Sec Memory Limit: 64 MBDescription
给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列。
请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形。
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
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 }