• 【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;
    }
  • 相关阅读:
    Access restriction: The constructor SunJCE() is not accessible due to restriction on required librar
    我选择,我奋斗
    C/C++语言写程序时的“段错误”总结
    VC中临时窗口与持久窗口的对比
    一个WinSocket编程实例
    error PRJ0003 : 生成“cmd.exe”时出错
    编辑利器VIM
    LED数码管的学习
    这个世界诱惑太多
    计算机英语名词简释
  • 原文地址:https://www.cnblogs.com/liumengyue/p/5246678.html
Copyright © 2020-2023  润新知