/*
已知圆上的点,求可合成的矩形。
一开始看到这个题直接傻逼了。
看到HINT N<=20 的数据范围,感觉暴力就可过。
如果一个矩形与园内切,我们可以得到这个矩形的对角线一定是这个圆的直接。
如果找到两条矩形的对角线就可以确定这个矩形了。
那么就可把这个问题转换为找到圆的直径问题。
找到直径个数,进行排列组合就可以得到答案。
AC: 1272 kb 28 ms
看有人优化到了92 KB 0 MS 的完全不知道怎么优化。。
*/
#include <iostream>
using namespace std;
int a[100];
int main()
{
int n;
cin >> n;
int sum = 0;
int temp = 0;
int ans = 0;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
sum += a[i];
}
if (sum == 1) //记录总周长,若为1,由题意得不存在矩形。
cout << 0 << endl;
else
{
sum >>= 1; //直径所对应的弧
int j = 0;
for (int i = 1; i < n; i++) //注意这里循环到n-1,而不是n,避免出现相同的直径。
{
temp += a[i];
while (temp>sum)
{
temp -= a[j];
j++;
}
if (temp == sum)
ans++;
}
cout << (ans*(ans - 1) >> 1 )<< endl;//C(ans,2)
}
return 0;
}
BZOJ-1800-飞行棋
最新推荐文章于 2019-05-03 15:34:16 发布