• 【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;
    }
  • 相关阅读:
    全栈必备Linux 基础
    Linux 的 Socket IO 模型
    Vim
    Linux 下使用 Sar 简介
    提高效率,推荐 5 款命令行工具
    Vim小技巧
    剑指Offer 矩形覆盖
    剑指Offer 变态跳台阶
    剑指Offer 跳台阶
    2016 网易校招内推C/C++第二场8.6
  • 原文地址:https://www.cnblogs.com/liumengyue/p/5246678.html
Copyright © 2020-2023  润新知