• [BZOJ1600] [Usaco2008 Oct] 建造栅栏


    Description

      勤奋的Farmer John想要建造一个四面的栅栏来关住牛们。他有一块长为n(4<=n<=2500)的木板,他想把这块本板切成4块。这四块小木板可以是任何一个长度只要Farmer John能够把它们围成一个合理的四边形。他能够切出多少种不同的合理方案。注意: *只要大木板的切割点不同就当成是不同的方案(像全排列那样),不要担心另外的特殊情况,go ahead。 *栅栏的面积要大于0.

      *输出保证答案在longint范围内。 *整块木板都要用完。

    Input

      *第一行:一个数n

    Output

      *第一行:合理的方案总数

    Sample Input

    6

    Sample Output

    6

      输出详解:
      Farmer John能够切出所有的情况为: (1, 1, 1,3); (1, 1, 2, 2); (1, 1, 3, 1); (1, 2, 1, 2); (1, 2, 2, 1); (1, 3,1, 1);
    (2, 1, 1, 2); (2, 1, 2, 1); (2, 2, 1, 1); or (3, 1, 1, 1).
      下面四种 -- (1, 1, 1, 3), (1, 1, 3, 1), (1, 3, 1, 1), and (3,1, 1, 1) – 不能够组成一个四边形.

    HINT

    Source

      资格赛

    Solution

      如果四条线段中最短的三条加起来比最长的线段长,辣么一定可以构成四边形。

      枚举前两条边的长度,后两条边的取值范围可以算出。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     int n, a, b, ans = 0;
     6     cin >> n;
     7     for(int i = 1; i <= (n - 1) >> 1; i++)
     8         for(int j = 1; j <= (n - 1) >> 1; j++)
     9         {
    10             a = min((n - 1) >> 1, n - i - j - 1);
    11             b = n - i - j - a;
    12             ans += max(a - b + 1, 0);
    13         }
    14     cout << ans << endl;
    15     return 0;
    16 }
    View Code
  • 相关阅读:
    Python 学习笔记 11.模块(Module)
    Python 学习笔记 8.引用(Reference)
    Python 学习笔记 9.函数(Function)
    Python 学习笔记 6.List和Tuple
    Python 学习笔记 4.if 表达式
    Python 学习笔记 2.自省
    Python 学习笔记 3.简单类型
    Python 学习笔记 7.Dictionary
    Python 学习笔记 5.对象驻留
    Python 学习笔记 10.类(Class)
  • 原文地址:https://www.cnblogs.com/CtrlCV/p/5491636.html
Copyright © 2020-2023  润新知