首页 > 其他分享 >凸包和凸组合例题

凸包和凸组合例题

时间:2023-08-15 09:55:07浏览次数:35  
标签:例题 return 组合 int double top 凸包 include PDD

https://codeforces.com/gym/467720/attachments M题
网上博客 https://blog.csdn.net/weixin_34284188/article/details/94669467
我们最终线性组合的点一定会落在凸包内部,我们的答案就是凸包的上,右边界的点,包括端点,也包括凸包边上的点
求凸包边上的点 的横纵坐标积的最大值,是列出二元一次方程,求最值。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define x first
#define y second
typedef pair<double,double> PDD;
const int N  =3e4+10;
const double eps = 1e-8;
int stk[N],top;

PDD q[N];
PDD operator -(PDD a,PDD b)
{
    return {a.x- b.x,a.y-b.y};
}
double cross(PDD a,PDD b)
{
    return a.x*b.y - a.y*b.x;
}
double area(PDD a,PDD b,PDD c)
{
    return cross(b-a,c-a);
}
int sign(double x)
{
    if(fabs(x)<eps) return 0;
    if(x>0) return 1;
    return -1;
}
int n;
int C;

//求上凸壳边上的最值
double cal(PDD u,PDD v)
{
    double A = (u.x - v.x) * (u.y - v.y);
    double B = (u.x - v.x) * v.y + (u.y - v.y) * v.x;
    double C = v.x * v.y;
    double x = -0.5 * B / A;
    if (sign(x - 0.0) <= 0)
        return 0;
    else
        x = min(x, 1.0);
    return (A * x + B) * x + C;

}
double ans = 0.0;
void andrew()
{
    sort(q,q+n);
    for(int i= 0;i<n;i++)
    {
        while(top>=2&&sign(area(q[stk[top-1]],q[stk[top]],q[i]))>0) top--;
        stk[++top] = i;
    }
    for(int i = 1;i<top;i++)
    ans = max(ans,cal(q[stk[i]],q[stk[i+1]]));
}
int main()
{
    cin>>n>>C;
    for(int i = 0;i<n;i++)
    {
        double c,h,p;
        scanf("%lf%lf%lf",&c,&h,&p);
        q[i] = {(double)h/c*C,(double)p/c*C};
        ans = max(ans,q[i].x*q[i].y);
    }
    andrew();
    printf("%.2lf\n",ans);
    
    return 0;
}

标签:例题,return,组合,int,double,top,凸包,include,PDD
From: https://www.cnblogs.com/freshman666/p/17630527.html

相关文章

  • ACCESS 说说组合框的应用
    在说应用之前,我觉得很有必要先讲讲组合框的一些常用属性:1.Dropdown:显示下拉菜单.这个属性可以在VBA下主动显示出来,但如果要隐藏它,只能通过转移焦点来达成.ComboObj.Dropdown2.AutoExpand:这是个布尔值,默认为True.一般会在Load事件中设置好.当用户输入的值与列表中......
  • 如何用随机方法求解组合优化问题(三)
    局部搜索应用:百万皇后问题皇后问题皇后问题:在一个\(n\timesn\)的棋盘上,每行每列有且只有一个皇后棋子,每对角线至多一个皇后棋子。如果使用回溯法,计算10皇后、20皇后问题还是可行的。但是当皇后数增加到一百万个时,又该如何求解呢?局部搜索算法用于求解组合优化问题,而皇后......
  • C语言求凸包的算法及实现
    C语言求凸包的算法及实现凸包问题是计算几何中的一个重要问题,它描述了一个点集中最小的凸多边形。在本文中,我们将探讨使用C语言来解决凸包问题的算法及其实现。C语言求凸包的算法及实现凸包算法的关键在于如何确定一个点是否在凸包上。对于一个给定的点集,我们可以选择一点作为......
  • 快速解决 const 与 typedef 类型组合时 ,const修饰谁的问题
    C++使用typedef给复合类型定义别名时,与const结合会产生看似“令人困惑”的类型推定,例如typedefchar*pstring;constpstringcstr=0;constpstring*ps;cstr到底是什么类型?如果直接把pstring展开成char*,就会认为cstr是constchar*类型,从而认为cstr是一个指向const......
  • 尺取法例题C++
    一、反向扫描(1)、判断回文串boolcheck(string&s,intleft,intright){inti=left,j=right;while(i<j){if(s[i]!=s[j]){returnfalse;}i++;j--;......
  • 创建定义store并使用组合式api、选项式api
    在项目根目录创建store文件夹(此步骤和vuex相同)在步骤一的store文件夹下根据不同的用途场景创建单独的store文件(等同于vuex中分模块)、定义store基本步骤步骤导入defineStore()方法:import{defineStore}from'pinia'使用defineStore定义store并导出import{defineS......
  • 175. 组合两个表
    表: Person+-------------+---------+|列名|类型|+-------------+---------+|PersonId|int||FirstName|varchar||LastName|varchar|+-------------+---------+personId是该表的主键列。该表包含一些人的ID和他们的姓和名的信......
  • 如何用随机方法求解组合优化问题(一)
    什么是组合优化问题定义优化问题设\(x\)是决策变量,\(D\)是\(x\)的定义域,\(f(x)\)是指标函数,\(g(x)\)是约束条件。则优化问题可以表示为求解满足\(g(x)\)的\(f(x)\)最小值问题。即:\[\min_{x\inD}(f(x)|g(x))\]组合优化问题如果在定义域\(D\)上,满足约束条件......
  • 排列组合
    排列数线排列从\(n\)个数中选\(m\)个数的方案数(注意选了相同的数顺序不同也算不同方案)记作\(A_n^m=\dfrac{n!}{(n-m)!}\)。证明:假设\(n\)个数种前\(m\)个是我们选出来的数。那么我们把\(n\)个数全排有\(n!\)种方案,而后\(n-m\)个数的不同排列会使前\(m\)......
  • 组合式api的使用方式
    方式一:通过setup选项<script>exportdefault{setup(){//提供数据//提供函数//提供计算属性等等.....}}</script>例子:<script>exportdefault{setup(){console.log('setup......')//直接提供数......