【CodeVS2226】飞行棋

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;
}

 

posted @ 2016-03-06 10:28  mengyue  阅读(245)  评论(0编辑  收藏  举报