zoukankan      html  css  js  c++  java
  • BZOJ 1800 [Ahoi2009]fly 飞行棋

    题目链接

    思路

    终于有一道自己想出来的题了,开心。

    因为是矩形,一定有直角,所以考虑直径,之后由于矩形对角线是两条直径,所以考虑组合数。

    直径有n条,矩形有c(n,2)个。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<map>
     4 using namespace std;
     5 int res,hf,sum[25],a[25];
     6 map<int,int>mp;
     7 long long fac(int k)
     8 {
     9     long long ans=1;
    10     for(int i=1;i<=k;i++)
    11         ans*=i;
    12     return ans;
    13 }
    14 long long cb(int n,int m)
    15 {
    16     return (fac(n)/fac(m))/fac(n-m);
    17 }
    18 int main()
    19 {
    20     int n;
    21     scanf("%d",&n);
    22     for(int i=1;i<=n;i++)
    23     {
    24         scanf("%d",a+i);
    25         sum[i]=sum[i-1]+a[i];
    26         mp[sum[i]]++;
    27     }
    28     if(sum[n]%2!=0)
    29     {
    30         printf("0
    ");
    31         return 0;
    32     }
    33     hf=sum[n]/2;
    34     for(int i=1;i<=n;i++)
    35     {
    36         if(sum[i]>hf)
    37             break;
    38         if(mp[sum[i]+hf])
    39             res++;
    40     }
    41     printf("%lld
    ",cb(res,2));
    42     return 0;
    43 }
  • 相关阅读:
    Promise
    includes()
    常见的数组去重方法
    concat()
    面试感想
    常见的前端面试题
    让div水平垂直居中的几种方法
    实现斐波拉契的几种方法
    使用lib-flexible
    什么是token
  • 原文地址:https://www.cnblogs.com/fantasquex/p/9379187.html
Copyright © 2011-2022 走看看