刷题向》一道简单的思路题BZOJ1800(EASY+)
这道题其实并不难,主要原因是数据范围很小,当然数据如果大来也可以优化,但重点是在做的时候用的思路很通用,
所以本题是一道思想题(当然思想也不难)
标题里的“+”体现在一些边界处理中。
直接甩题目
Description
给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列。
请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形。
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
然后甩代码
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