BZOJ1800_fly飞行棋_KEY

题目传送门

看数据范围,N<=20!

你没看错,搜索都能过。

O(N^2)的做法,就是先求出有几对点之间的距离为圆周长的一半。

然后求C(N,2)即可。

code:

/**************************************************************
    Problem: 1800
    User: yekehe
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:820 kb
****************************************************************/
 
#include <cstdio>
using namespace std;
 
int N,sum[25],W,K;
 
int main()
{
    scanf("%d",&N);
        for(int i=1;i<=N;i++)scanf("%d",&sum[i]),sum[i]+=sum[i-1];//记录前缀和
    if(sum[N]&1)return printf("0"),0;//特判无法构成的情况
    W=sum[N]>>1;//圆周长的一半
        for(int i=1;i<N;i++)
            for(int j=i+1;j<N;j++)
                if(sum[j]-sum[i-1]==W){
                    K++;
                }
    printf("%d",(K-1)*K>>1);//C(N,2)
    return 0;
}
原文地址:https://www.cnblogs.com/Cptraser/p/8441480.html