zoukankan      html  css  js  c++  java
  • BZOJ1800 fly 飞行棋 [几何]

    fly fly 飞行棋

    给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列。 请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形。

    N25N le 25 .


    color{blue}{最初想法}

    发现数据范围很小, 首先就想到 O(N2)O(N^2) 枚举端点, 然后检查关于直径对称的对应端点是否存在,
    但是发现这样去作关于直径对称的线段很麻烦, 作罢 .


    color{red}{正解部分}

    矩形的四个角都为直角, 而直角所对弦长为直径, 直径所对弧长为周长的一半,
    所以满足条件的矩形的对角线就对应直径, 于是考虑 枚举 对角线, 使用对角线去 """拼" 矩形 .
    于是枚举 i,ji, j 两个端点, 判断其距离 tt 是否满足 t=d2t = frac{d}{2}, 若满足, 则说明发现了一条新的对角线. (d)(d为周长)

    最后得到对角线的个数为 cntcnt 个, 取出其中 22 个构成一个矩形, 则答案为 Ccnt2=12cnt(cnt1)C_{cnt}^2=frac{1}{2}cnt(cnt-1) .

    时间复杂度 O(N2)O(N^2) .


    color{red}{实现部分}

    • 注意圆的周长可能是奇数 .
    #include<bits/stdc++.h>
    #define reg register
    
    const int maxn = 25;
    
    int N;
    int d;
    int cnt;
    int A[maxn];
    
    int main(){
            scanf("%d", &N);
            for(reg int i = 1; i <= N; i ++) scanf("%d", &A[i]), d += A[i], A[i] += A[i-1];
            for(reg int i = 1; i <= N; i ++)
                    for(reg int j = i+1; j <= N; j ++)
                            if((abs(A[i]-A[j])<<1) == d) cnt ++;
            printf("%d
    ", cnt*(cnt-1)>>1);
            return 0;
    }
    
    
  • 相关阅读:
    错题本
    前端常用的代码片段
    前端生成二维码 jquery.qrcode.js
    jquery获取第几个元素的方法总结
    Jquery 获取第一个子元素
    个人作品(2016.3.17更新)
    360度全景制作
    期末项目_通用教学管理系统(季远琦&庞思瑶)
    java ee 第四周作业
    Web Service和EJB的区别
  • 原文地址:https://www.cnblogs.com/zbr162/p/11822503.html
Copyright © 2011-2022 走看看