P1284 三角形牧场

2023-11-01 16:44
文章标签 三角形 牧场 p1284

本文主要是介绍P1284 三角形牧场,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Portal.

首先,我们需要一些初中数学知识——秦九韶公式(又名海伦公式):
p = a + b + c 2 S = p ( p − a ) ( p − b ) ( p − c ) \begin{align} &p=\dfrac{a+b+c}{2}\\ &S=\sqrt{p(p-a)(p-b)(p-c)} \end{align} p=2a+b+cS=p(pa)(pb)(pc)
假设 f ( k , i , j ) f(k,i,j) f(k,i,j) 表示前 k k k 个木板能否围成两边长为 i i i j j j 的三角形,状态转移时有三种情况:

  1. 把第 k k k 个木板加到边 i i i 中,前 k − 1 k-1 k1 个木板要围成两边长为 i − l k i-l_k ilk j j j 的三角形,即 f ( k − 1 , i − l k , j ) f(k-1,i-l_k,j) f(k1,ilk,j)
  2. 把第 k k k 个木板加到边 j j j 中,同理 f ( k − 1 , i , j − l k ) f(k-1,i,j-l_k) f(k1,i,jlk)
  3. 把第 k k k 个木板加到第三条边中, f ( k − 1 , i , j ) f(k-1,i,j) f(k1,i,j)

三者或运算之后的真假即结果。

可以观察到,转移过程中只跟前 k − 1 k-1 k1 个木板的状态有关,所以我们可以采用背包的滚动数组思想,压掉 k − 1 k-1 k1 这一层。

注意:

  • 要用 double
  • 要反着枚举 i i i j j j,这要参考 01 01 01 背包的思想,如果正着枚举会重复使用某一条边,并且压掉的 k − 1 k-1 k1 这一层循环不能保存之前的状态会被替代。
  • 初始化: f ( 0 , 0 ) = 1 f(0,0)=1 f(0,0)=1

代码如下:

#include <bits/stdc++.h>
using namespace std;int l[45];
bool f[805][805];
double ans;double work(double a,double b,double c)
{double p=(a+b+c)/2;return sqrt(p*(p-a)*(p-b)*(p-c));
}bool check(int a,int b,int c)
{if(a+b>c&&a+c>b&&b+c>a) return 1;return 0;
}int main()
{int n,cc,i,j,k;cin>>n;for(i=1;i<=n;i++) cin>>l[i],cc+=l[i];f[0][0]=1;for(k=1;k<=n;k++)for(i=cc/2;i>=0;i--)for(j=cc/2;j>=0;j--){if(i-l[k]>=0&&f[i-l[k]][j]) f[i][j]=1;else if(j-l[k]>=0&&f[i][j-l[k]]) f[i][j]=1;}ans=-1;for(i=cc/2;i>0;i--)for(j=cc/2;j>0;j--){if(!f[i][j]) continue;if(!check(i,j,cc-i-j)) continue;ans=max(ans,work(i,j,cc-i-j));}if(ans!=-1) cout<<(long long)(ans*100);else cout<<-1;return 0;
}

这篇关于P1284 三角形牧场的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/324362

相关文章

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

CSS实现DIV三角形

本文内容收集来自网络 #triangle-up {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid red;} #triangle-down {width: 0;height: 0;bor

双指针(5)_单调性_有效三角形的个数

个人主页:C++忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创 双指针(5)_单调性_有效三角形的个数 收录于专栏【经典算法练习】 本专栏旨在分享学习C++的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. 题目链接: 2.题目描述 : 3.解法 :     解法一(暴力枚举) :     算法思路 :     代码展示 : 暴力枚

利用向量积(叉积)计算三角形的面积和多边形的面积(hdu2036)

开始撸计算几何题目了。。。。。。。 预备知识:叉乘求多边形面积 参考证明资料: 公式证明: http://www.cnblogs.com/xiexinxinlove/p/3708147.html 高中知识: http://wenku.baidu.com/view/867e6edfad51f01dc281f11a.html #include<stdio.h>#inclu

[数据集][目标检测]智慧牧场猪只检测数据集VOC+YOLO格式16245张1类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):16245 标注数量(xml文件个数):16245 标注数量(txt文件个数):16245 标注类别数:1 标注类别名称:["pig"] 每个类别标注的框数: pig 框数 = 28514 总框数:28514 使用标

拼接三角形

/********************************************************************************* 问题描述: 牛牛手里有N根木棒,分别编号为1~N,现在他从N根里想取出三根木棒,使得三根木棒构成一个三角形,你能计算出牛牛有多少种取法吗?(考虑两种取法中使用的木棒编号有一个不一样就认为是不同的取法)。  输入描述: 首先输

OpenGL/GLUT实践:实现反弹运动的三角形动画与键盘控制(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 运行效果2 实验过程2.1 环境配置2.2 绘制三角形2.2.1 渲染函数2.2.2 主函数2.2.3 运行结果 2.3 调整窗口大小2.4 简单动画与按键控制2.4.1 简单旋转2.4.2 键盘控制 2.5 窗口反弹动画2.5.1 处理窗口大小变化2.5.2 渲染函数2.5.3 定时器2.5.4 控制速度

CSS详解:绘制三角形过程

前言 本文旨在用最简单的方式展示CSS border绘制三角形的各种方法,虽然用css 绘制三角形已经不是什么新鲜事了,不过,这篇文章将会尽力展示最全的三角形各种绘制方式。 附送一个三角形在线生成器 原理-盒子模型 如上图,这是一个盒子模型的结构,分为四个区域,content、padding、border, margin 。而本次示例主要用到的是盒子模型中的content和

★ 算法OJ题 ★ 力扣611 - 有效三角形的个数

Ciallo~(∠・ω< )⌒☆ ~ 今天,椎名日和将和大家一起做一道双指针算法题--有效三角形的个数~ 目录 一  题目 二  算法解析 三  编写算法 一  题目 二  算法解析 给三个数,判断是否能构成三角形的条件:两个较小的数相加大于第三个数。 解法⼀:暴力求解 算法思路:三层 for 循环枚举出所有的三元组,并且判断是否能构成三⻆形。(会超时)

MATLAB 计算三角形的外接圆心和半径(84)

MATLAB 计算三角形的外接圆心和半径(84) 一、算法介绍二、算法实现1.代码 一、算法介绍 计算三角形的外接圆心和半径,可视化显示结果 二、算法实现 1.代码 % 设置三个点的坐标A = [1, 1];B = [4,