• EOJ 1058. 挤模具 (多边形面积)


    题目链接:1058. 挤模具

    题意

    给出模具的底和体积,求模具的高。

    思路

    模具的底为多边形,因此求出多边形面积,用体积除以底的面积就是答案。

    多边形的面积求解见 EOJ 1127. 多边形面积(计算几何)

    代码

    #include <cstdio>
    #include <iostream>
    #include <vector>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    typedef double db;
    const db eps = 1e-10;  
    const db pi = acos(-1.0);  
    const ll inf = 0x3f3f3f3f3f3f3f3f;  
    const ll maxn = 100 + 10;
    
    inline int dcmp(db x) {
        if(fabs(x) < eps) return 0;
        return x > 0? 1: -1;
    }
    
    class Point {
    public:
        double x, y;
        Point(double x = 0, double y = 0) : x(x), y(y) {}
        void input() {
            scanf("%lf%lf", &x, &y);
        }
        bool operator<(const Point &a) const {
            return (!dcmp(x - a.x))? dcmp(y - a.y) < 0: x < a.x;
        }
        bool operator==(const Point &a) const {
            return dcmp(x - a.x) == 0 && dcmp(y - a.y) == 0;
        }
        db dis2(const Point a) {
            return pow(x - a.x, 2) + pow(y - a.y, 2);
        }
        db dis(const Point a) {
            return sqrt(dis2(a));
        }
        db dis2() {
            return x * x + y * y;
        }
        db dis() {
            return sqrt(dis2());
        }
        Point operator+(const Point a) {
            return Point(x + a.x, y + a.y);
        }
        Point operator-(const Point a) {
            return Point(x - a.x, y - a.y);
        }
        Point operator*(double p) {
            return Point(x * p, y * p);
        }
        Point operator/(double p) {
            return Point(x / p, y / p);
        }
        db dot(const Point a) {
            return x * a.x + y * a.y;
        }
        db cross(const Point a) {
            return x * a.y - y * a.x;
        }
    };
    
    Point p[maxn];
    
    int n;
    
    db area() {
        if(n < 3) return 0.0;
        db ans = 0.0;
        for(int i = 2; i < n; ++i) {
            ans += (p[i] - p[1]).cross(p[i + 1] - p[1]);
        }
        return ans * 0.5;
    }
    
    int main() {
        while(~scanf("%d", &n) && n) {
            db s = 0;
            db v;
            for(int i = 1; i <= n; ++i) {
                p[i].input();
            }
            scanf("%lf", &v);
            s = area();
            printf("BAR LENGTH: %.2lf
    ", v / fabs(s));
        }
        return 0;
    }
    
  • 相关阅读:
    vs2003 序列化json
    异步执行sql语句
    【读书笔记】原型模式代码(C#)
    【读书笔记】工厂方法模式代码(C#,C++)
    【转】C++纯虚函数
    【读书笔记】模板方法模式代码(C++)
    【读书笔记】代理模式翻译成C++了
    【读书笔记】模板方法模式(C#)
    【读书笔记】原型模式代码(C++) 第一版
    【读书笔记】原型模式第二版(C++)新鲜出炉
  • 原文地址:https://www.cnblogs.com/wulitaotao/p/11688997.html
Copyright © 2020-2023  润新知