• CF #38 Vasya the Architect


    题意是放若干个正方体,问说最多能放多少个,使得平衡。

    考虑如果只有两个正方体,则上面的正方体的重心要在下面正方体的顶面的范围之内,因为这样,可以把上面的正方体等价为一个质量一样大的,位置在重心的点。如果有多个物体,则从最上面开始判断,平衡之后,就把前n个物体求下重心,看成一个点,看是否能放在第n+1个物体上。

    代码
    #include <iostream>
    #include
    <string>
    #include
    <stdio.h>
    #include
    <stdlib.h>
    #include
    <algorithm>
    #include
    <string.h>
    #include
    <vector>
    #include
    <math.h>
    #include
    <map>
    #include
    <time.h>
    #include
    <queue>
    #include
    <set>
    using namespace std;

    const int MAX = 105;

    struct NODE
    {
    int x1, y1, x2, y2;
    double cx, cy;
    NODE() {}
    NODE(
    int _x1, int _y1, int _x2, int _y2)
    {
    x1
    = min(_x1, _x2);
    y1
    = min(_y1, _y2);
    x2
    = max(_x1, _x2);
    y2
    = max(_y1, _y2);

    cx
    = (x1 + x2) * 1.0 / 2;
    cy
    = (y1 + y2) * 1.0 / 2;
    }
    double vol()
    {
    double a = x2 - x1;
    return a * a * a;
    }
    }node[MAX];

    int n;

    pair
    <double, double> center[MAX][MAX];

    int main()
    {
    while(scanf("%d", &n) != EOF)
    {
    for(int i = 1; i <= n; i++)
    {
    int a, b, c, d;
    scanf(
    "%d%d%d%d", &a, &b, &c, &d);
    node[n
    + 1 - i] = NODE(a, b, c, d);
    }
    int ans = 0;

    for(int i = 1; i <= n; i++)
    {
    double M = 0;
    double x = 0, y = 0;
    for(int j = i; j <= n; j++)
    {
    M
    += node[j].vol();
    x
    += node[j].vol() * node[j].cx;
    y
    += node[j].vol() * node[j].cy;
    center[i][j].first
    = x / M;
    center[i][j].second
    = y / M;
    }
    }

    for(int i = n; i >= 1; i--)
    {
    int j;
    for(j = i; j <= n - 1; j++)
    {
    if(center[i][j].first < node[j + 1].x1) break;
    if(center[i][j].first > node[j + 1].x2) break;
    if(center[i][j].second < node[j + 1].y1) break;
    if(center[i][j].second > node[j + 1].y2) break;
    }
    if(j <= n - 1) break;
    ans
    ++;
    }
    printf(
    "%d\n", ans);
    }
    }

    /*
    2
    0 0 3 3
    1 0 4 3

    2
    0 0 3 3
    2 0 5 3

    3
    0 0 3 3
    1 0 4 3
    2 0 5 3
    */
  • 相关阅读:
    #背包#nssl 1488 上升子序列
    #环#nssl 1487 图
    #分治#JZOJ 4211 送你一颗圣诞树
    #概率,dp#JZOJ 4212 我想大声告诉你
    #并查集#JZOJ 4223 旅游
    #dp#nssl 1478 题
    #对顶堆#nssl 1477 赛
    #线段树,离散#nssl 1476 联
    #折半搜索,状压dp#nssl 1471 Y
    #并查集,线性筛#nssl 1470 X
  • 原文地址:https://www.cnblogs.com/litstrong/p/1866858.html
Copyright © 2020-2023  润新知