刷题向》一道简单的思路题BZOJ1800(EASY+)

  这道题其实并不难,主要原因是数据范围很小,当然数据如果大来也可以优化,但重点是在做的时候用的思路很通用,

  所以本题是一道思想题(当然思想也不难)

  标题里的“+”体现在一些边界处理中。

  直接甩题目

Description

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

Input

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

Output

所构成不重复矩形的个数

Sample Input

8
1
2
2
3
1
1
3
3


Sample Output

3

HINT

N<= 20

  然后甩代码

 1 /**************************************************************
 2     Problem: 1800
 3     User: PencilWang
 4     Language: C++
 5     Result: Accepted
 6     Time:0 ms
 7     Memory:820 kb
 8 ****************************************************************/
 9  
10 #include<stdio.h>
11 int n,a[41],s[41],ans;
12 void find(int mid,int x)
13 {
14     int p=x+1;
15     while(p<n&&(s[p]-s[mid]<<1)<s[n])++p;
16     if(p>=n)return ;
17     if((s[p]-s[mid])<<1==s[n])
18             ans++;
19     return ;
20 }
21 void fuck(int L,int R)
22 {
23     for(int mid=L+1;mid<R;++mid)
24     find(mid,R);
25     return ;
26 }
27 int main()
28 {
29     scanf("%d",&n);
30     for(int i=1;i<=n;i++)
31     {
32     scanf("%d",a+i);
33     s[i]=s[i-1]+a[i];
34     }
35     int L=0,R=1;
36     while(L<R&&R<=n)
37     {
38     if(((s[R]-s[L])<<1)>s[n])L++;
39     else if(((s[R]-s[L])<<1)<s[n])R++;
40     else
41         {
42         fuck(L,R);
43         L++;
44         }
45     }
46     printf("%d",ans);
47     return 0;
48 }
49 

 

posted @ 2016-10-18 13:28  PencilWang  阅读(386)  评论(0编辑  收藏  举报