zoukankan      html  css  js  c++  java
  • BZOJ-1800 飞行棋 数学+乱搞

    这道题感觉就是乱搞,O(n^4)都毫无问题
    

    1800: [Ahoi2009]fly 飞行棋
    Time Limit: 10 Sec Memory Limit: 64 MB
    Submit: 1172 Solved: 959
    [Submit][Status][Discuss]

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

    Input
    第一行为正整数N,表示点的个数,接下来N行分别为这N个点所分割的各个圆弧长度

    Output
    所构成不重复矩形的个数

    Sample Input
    8
    1
    2
    2
    3
    1
    1
    3
    3

    Sample Output
    3

    HINT
    N<= 20
    这里写图片描述

    首先想到O(n^4)的暴力。。后来一写想到,圆的内接的矩形的对角线一定是直径。于是。。。。
    找一波直径。。。。
    找到对角线后,矩形的数目即
    C(num,2)=num!/(2!(num-2)!)=(num(num-1))/2

    莫名同YveH爷撞思路了。。。而且好久没写过这么短的东西了。。(*^__^*)
    

    简短的代码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    int n;
    int h[50]={0};
    int ans=0;
    
    int main()
    {
        scanf("%d",&n);
        for (int i=1; i<=n; i++)
            {scanf("%d",&h[i]);h[i]+=h[i-1];}
        int x=1,y=2;
        while (x<=y && y<=n)
            {
                if (h[y]-h[x]>=h[n]/2)
                    {if (h[y]-h[x]==h[n]/2) ans++;x++;}
                else
                    y++;
            }
        printf("%d
    ",ans*(ans-1)/2);
        return 0;       
    }
  • 相关阅读:
    Linux查看系统信息
    pgrep 和 pkill 使用小记
    linux下json库的编译及例程
    Epoll 实例
    gcc中的内嵌汇编语言
    BZOJ 1053: [HAOI2007]反素数ant
    2018.7.15模拟赛
    BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
    BZOJ 4241: 历史研究
    LUOGU P2365 任务安排
  • 原文地址:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5346217.html
Copyright © 2011-2022 走看看