Description
在经过地“小小宇航员夏令营”的学习以及模拟飞行实验后,小可可明白宇航员并不是那么容易当的,除了需要强健的身体,丰富的经验以及灵活的应变能力以外,缜密的思维也是不可少的,为了早日实现自己的宇航员的梦想,小可可决定在平时就开始锻炼——利用棋类游戏来锻炼自己的思维。
小可可发明一种飞行棋,棋盘是一个圆周形,在圆周形上有若干个点,已知这些点与点之间的弧长,弧长均为正整数,并且依圆弧顺序排列,飞行棋的规则是找出这些点中有没有可以围成矩形的,在最短时间内找出所有不重复矩形的玩家胜出。
Input
第一行为正整数N,表示棋盘上点的个数,
接下来n行分别为这N个点所分割的各个圆弧的长度。
Output
所构成的不重复的矩形。
Sample Input
8
1
2
2
3
1
1
3
3
Sample Output
3
HINT
对于100%数据,0<N<=100,0<每条弧长<1000
题解
先处理出dis数组,存i到j之间的劣弧长度
然后枚举,构成矩形的条件是,对边相等,对角线相等,因为弧长与边长成比例,所以可以用弧长代替边长
#include<iostream> #include<cstdio> using namespace std; const int N=110; int a[N],dis[N][N]; int n,sum,ans; void init(){ cin>>n; for (int i=1;i<=n;i++){ scanf("%d",&a[i]);sum+=a[i];} } void idis(){ for (int i=1;i<n;i++) for (int j=i+1;j<=n;j++) dis[i][j]+=dis[i][j-1]+a[j]; for (int i=1;i<n;i++) for (int j=1;j<=n;j++) dis[i][j]=min(dis[i][j],sum-dis[i][j]); } bool judge(int a,int b,int c,int d){ if (dis[a][b]==dis[c][d]&&dis[a][d]==dis[b][c]) if (dis[a][c]==dis[b][d]) return true; return false; } int main(){ init(); idis(); 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 l=k+1;l<=n;l++) if (judge(i,j,k,l)) ans++; cout<<ans; }