HDU5135 Little Zu Chongzhi's Triangles

2023-11-02 13:20

本文主要是介绍HDU5135 Little Zu Chongzhi's Triangles,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目大意:

       有n根火柴棒,现在将它们拼成若干个三角形,最大化所拼三角形总面积,输出这个最大值。(3 <= N<= 12)

思路:

    由于n很小,先找出所有可能的三角形,记录它的面积和所用的火柴。记录所用火柴时,可以用n位二进制表示,用了哪根哪位就记为1。

    之后就是类似背包的动规了。

    f[i][j]表示到底i个三角形,火柴棒剩余情况为j(同样,剩哪个哪个是1)的最大面积,tri[i].area表示面积,tri[i].stick表示所用火柴。

    转移方程:f[i][j]=max(f[i-1][j],f[i-1][j^tri[i].stick]+tri[i].area)或f[i][j]=f[i-1][j];

    前者的条件是tri[i].stick是1的位j都是0,即tri[i]&j==0。

 

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<cstdlib>
  5 #include<cmath>
  6 
  7 using namespace std;
  8 
  9 const int M=(1<<12);
 10 
 11 struct node
 12 {
 13     double area;
 14     int stick;
 15     node()
 16     {
 17         area=0;
 18         stick=0;
 19     }
 20 }tri[300];
 21 int n,sti[20],trn;
 22 double f[222][M];
 23 
 24 int change(int i,int j,int k)
 25 {
 26     i--;j--;k--;
 27     return (1<<i)+(1<<j)+(1<<k);
 28 }
 29 
 30 double check(int i,int j,int k)
 31 {
 32     double ret=0;
 33 /*    double p=i+j+k;
 34     p/=2;
 35     ret=sqrt(p*(p-i)*(p-j)*(p-k));*/
 36     double angle=i*i+j*j-k*k;
 37     double aa=i*j;
 38     angle=angle/(2*aa);
 39     angle=sqrt(1-angle*angle);
 40     ret=0.5*aa*angle;
 41     return ret;
 42 }
 43 
 44 double maxx(double a,double b)
 45 {
 46     if(a>b)return a;
 47     else return b;
 48 }
 49 
 50 int main()
 51 {
 52     scanf("%d",&n);
 53     while(n)
 54     {
 55         memset(sti,0,sizeof(sti));
 56         memset(tri,0,sizeof(tri));
 57         for(int i=1;i<=n;i++)scanf("%d",&sti[i]);
 58         trn=0;
 59         for(int i=1;i<=n;i++)
 60             for(int j=i+1;j<=n;j++)
 61                  for(int k=j+1;k<=n;k++)
 62                  {
 63                      if(i!=j&&j!=k&&i!=k)
 64                      {
 65                          if((sti[i]+sti[j]>sti[k])&&(sti[i]+sti[k]>sti[j])&&(sti[k]+sti[j]>sti[i]))
 66                          {
 67                              trn++;
 68                              tri[trn].stick=change(i,j,k);
 69                              tri[trn].area=check(sti[i],sti[j],sti[k]);
 70                          }
 71                      }
 72                  }
 73         if(trn==0)
 74         {
 75             printf("0.00\n");
 76             scanf("%d",&n);
 77             continue;
 78         }
 79         if(trn==1)
 80         {
 81             printf("%.2lf\n",tri[1].area);
 82             scanf("%d",&n);
 83             continue;
 84         }
 85         memset(f,0,sizeof(f));
 86         int tem=(1<<n)-1;
 87         for(int i=1;i<=trn;i++)
 88         {
 89             for(int j=0;j<tem;j++)
 90             {
 91                 f[i][j]=f[i-1][j];
 92                 if(!(j&tri[i].stick))
 93                 {
 94                     f[i][j]=maxx(f[i-1][j],f[i-1][j^tri[i].stick]+tri[i].area);
 95                 }
 96             }
 97         }
 98         double ans=0;
 99         for(int i=0;i<tem;i++)
100         {
101             ans=maxx(ans,f[trn][i]);
102         }
103         printf("%.2lf\n",ans);
104         scanf("%d",&n);
105     }
106     return 0;
107 }
View Code

 

转载于:https://www.cnblogs.com/LiqgNonqfu/p/9751336.html

这篇关于HDU5135 Little Zu Chongzhi's Triangles的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

little knowledge及errno的一些错误定义

select()机制中提供一fd_set的数据结构,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一socket或文件发生了可读或可写事件。   LINUX 下宏定义

poj 3735 Training little cats(构造矩阵)

http://poj.org/problem?id=3735 大致题意: 有n只猫,开始时每只猫有花生0颗,现有一组操作,由下面三个中的k个操作组成: 1. g i 给i只猫一颗花生米 2. e i 让第i只猫吃掉它拥有的所有花生米 3. s i j 将猫i与猫j的拥有的花生米交换 现将上述一组操作循环m次后,问每只猫有多少颗花生? 很明显,要先构造矩阵,构造一个(n+1)

Right Triangles

H - Right Triangles Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit  Status  Practice  CodeForces 52B Description You are given a n × m field consistin

Codeforces Round #259 (Div. 2) D Little Pony and Harmony Chest

(比赛的时候全去想C了.... 预处理状压出每一个数的因数,然后用两数的状态相加与或 是非相同来判断是否互质 暴力枚举每一个数,记录出每一个状态最小的绝对值以及该位置的数 f[ i ][ 1<<j ] 前者表示第几位,后者表示状态,值表示在 绝对值的最小和 取n为最小绝对值的状态,再逆着找在数 </pre><pre name="code" class="cpp">#include <

Codeforces Round #259 (Div. 2) C Little Pony and Expected Maximum

用逆向思维解+容斥原理 最大为 m 个的概率为 1减去不是m最大的概率,(1 - (( m-1 )/ m ) ^ n ),则 m-1 的概率为 在 不是 m 的状态下 乘以 1减去不是m-1最大的概率 以此类推 感谢楠哥的思路 #include <algorithm>#include <iostream>#include <iomanip>#include <cstring>#

hdu 5135 Little Zu Chongzhi's Triangles(计算几何:三角形面积)

给出多条木棍,问你用这些木棍所能组成的多个三角形面积最大和是多少 贪心做,所以先排序,但是遍历的过程中不能从前向后遍历 因为可能会存在4条边取后三条边是最优的类似情况 正解是从后向前遍历,用海伦公式求解 代码如下: /* ***********************************************Author :yinhuaEmail

lightoj 1307 Counting Triangles | 二分/暴力

题意: 给你N条边,问你能组成三角形的方法数。 思路: 判断三条边能否组成三角形,根据任意两条边的和大于第三边。 实际上,在确定A<=B<=C的情况下,只要A+B的和大于C即可认为ABC能组成三角形。 这题可以不用二分,用二分速度反而变慢了。排好序后乱搞就可以了。 AC代码: #include <cstring>#include <cstdlib>#include <cstd

牛客little w and Discretization

玩一下样例发现,只要找到mex就可以知道有((1-mex)的值)所在的位置离散化后和原本的值是一样的,所以询问区间的长度-(1-mex)有几个值就是答案,数据范围3e5,莫队+值域分块求区间mex,计算1-mex有几个位置属于这个值域内,a[i] 1e9,但是可以发现a[i]>3e5后离散化必然和原本的值不一样,所以a[i]=3e5+1; // Problem: little w and D

Hud 5024 Wang Xifeng's Little Plot(2014 ACM/ICPC Asia Regional Guangzhou Online)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5024 题目的意思就是 :找只能拐一个90度的弯的最长路。。直接模拟就好。。 记得网赛的时候,对这个题的题意还是比较有争议的。。。 贴下最主要的题意:if there was a turn, that turn must be ninety degree. 如果有弯,那必须是90度的弯。。这一点

UVA - 585 Triangles

题意:求最大的三角形 思路:先初始化从左到右和从右到左的最大连续的‘-’,然后就是当奇数列的时候找头向下的三角形,偶数的时候相反找 #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 200;char map[