【BZOJ 1800】[Ahoi2009]fly 飞行棋

来源:互联网 发布:淘宝改后台软件 编辑:程序博客网 时间:2024/05/23 14:33

Description

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

Input

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

Output

所构成不重复矩形的个数

Sample Input

8

1

2

2

3

1

1

3

3

Sample Output

3

HINT

N<= 20


题很妙,数据规模很小,所以暴力就好。

#include<bits/stdc++.h>using namespace std;#define N 50int a[N],n;int main(){    cin>>n;    for(int i=1;i<=n;i++)        cin>>a[i],a[i]+=a[i-1];    int tot = 0;    for(int i=1;i<=n;i++)        for(int j=i+1;j<=n;j++)            for(int k=j+1;k<=n;k++)                for(int p=k+1;p<=n;p++)                    if(a[j]-a[i]==a[p]-a[k]&&a[k]-a[j]==(a[n]-a[p]+a[i]))                        tot++;                          cout<<tot;    return 0;}
    #include<stdio.h>      #include<iostream>      #include<algorithm>      #include<string.h>      using namespace std;      int i,j,n,s,x,ans,a[25];      int b,c,d,e;      int main()      {          scanf("%d",&n);          for(i=1;i<=n;i++)              scanf("%d",&a[i]);          s=0;          for(i=1;i<=n;i++)              s+=a[i];          if(s&1)          {              printf("0");              return 0;          }          s/=2;          x=0;j=1;          ans=0;          for(i=1;i<n;i++)          {              x+=a[i];              while(x>s)              {                  x-=a[j];                  j++;              }              if(x==s) ans++;          }          cout<<ans*(ans-1)/2;          return 0;      }  
0 0
原创粉丝点击