UVALive 7077 Little Zu Chongzhi's Triangles (有序序列和三角形的关系)

  这个题……我上来就给读错了,我以为最后是一个三角形,一条边可以由多个小棒组成,所以想到了状态压缩各种各样的东西,最后成功了……结果发现样例过不了,三条黑线就在我的脑袋上挂着,改正了以后我发现N非常小,想到了回溯每个棍的分组,最多分5组,结果发现超时了……最大是5^12 =  244,140,625,厉害呢……

  后来想贪心,首先想暴力出所有可能的组合,结果发现替换问题是一个难题……最后T T ,我就断片了。。

  等看了别人的办法以后,我才发现我忽视了三角形的特性,和把数据排序以后的特点。 如果数据从大到小排序为 a,b,c,d,e...会发现这样一个特点,a+b>c,a+c>b,这样一来组合成三角形的唯一条件就是b+c>a,同时也发现是a以后的任意两个数的和都不会大于b+c,所以只要b+c不行,后面的都不可以。如果b+c可以,那么他就是最好的选择,因为后面的任意一对都不可能组合成比a,b,c面积更大的三角形。所以这个题就很清晰了,i只能和i+1和i+2组合为三角形。也可以把这个题归为贪心,也是因为他确实具有贪心的特性,不过更多的是应用有序序列和三角形的关系。

  受这个题的影响,我想起了在2016CCPC长春站做过的一道题,给出一个1-n的序列,求出最少去掉多少个数使其不能构成三角形。这样一来这个序列就是从小到大拍的,a,b,c,d,e,首先b+c>a,a+c>b,所以只要满足a+b>c就可以构成三角形,所以应该尽量避免这样的情况产生,处理方法为,去掉满足这样情况的c,为什么去c,不去a和b呢,因为要把尽量小的数留下来,最后会发现,留下的是1,2,3,5,8...的斐波那契数列。

  代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
#define N 13
int stick[N],n;
bool cmp(int a,int b)
{
    return a > b;
}
bool ok(int i,int j,int k){
    return stick[j]+stick[k]>stick[i];
}
double Get_area(int a,int b,int c)
{
    double p = (a+b+c)/2.0;
    return sqrt(p*(p-a)*(p-b)*(p-c));
}
int main()
{
//    freopen("I.in.cpp","r",stdin);
    double ans;
    while(~scanf("%d",&n))
    {
        if(n == 0) break;
        for(int i = 0; i < n; i++)
        {
            scanf("%d",&stick[i]);
        }
        sort(stick,stick+n,cmp);
        ans = 0;
        for(int i = 0; i < n-2; i++)
        {
            if(ok(i,i+1,i+2))
            {
                ans += Get_area(stick[i],stick[i+1],stick[i+2]);
                i += 2;
            }
        }
        printf("%.2f\n",ans);
    }
    return 0;
}

UVALive 7077 Little Zu Chongzhi's Triangles (有序序列和三角形的关系)

时间: 2025-01-06 01:15:37

UVALive 7077 Little Zu Chongzhi's Triangles (有序序列和三角形的关系)的相关文章

URAL 7077 Little Zu Chongzhi&#39;s Triangles(14广州I)

题目传送门 题意:有n根木棍,三根可能能够构成三角形,选出最多的三角形,问最大面积 分析:看到这个数据范围应该想到状压DP,这次我想到了.0010101的状态中,1表示第i根木棍选择,0表示没选,每一次三根木棍累加转移方程.虽说很简单,但是能自己独立敲出来还是很开心的,AC的快感! /************************************************ * Author :Running_Time * Created Time :2015/10/14 星期三 13:4

HDU 5135 Little Zu Chongzhi&#39;s Triangles(简单水题)

题目链接: 戳我 题目大意: 给一堆 木棍,用这些木棍组成三角形,要组成的所有的三角形的面积和最大,不一定要用完所有的木棍. 样例解释: 3 //三个棍子 1 1 20   // 每个棍子的长度,自然,这三个棍子不可能组成三角形,故输出 0.00 7          // 7个棍子 3 4 5 3 4 5 90 // 组成两个三角形(3, 3 4)和(4, 4, 5),面积和即为13.64 0   // 输出 0 退出 解题思路: 本来不想写题解的,因为太水了,,,,,,, 可是看到 谷歌搜出

[HDU 5135] Little Zu Chongzhi&#39;s Triangles (dfs暴搜)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5135 题目大意:给你n条边,选出若干条边,组成若干个三角形,使得面积和最大.输出最大的面积和. 先将边从小到大排序,这样前面的两条边加起来如果不大于第三条边就可以跳出,这是一个存在性条件. dfs(int idx,int now,int cnt,int nowmax)代表我当前处理的是第idx条边,已经加入边集的有cnt条边,当前的边的长度和为now,组成的最大面积和为nowmax. 暴力枚举每个三

hdoj 5125 Little Zu Chongzhi&#39;s Triangles【状态压缩dp】

题目:hdoj 5125 Little Zu Chongzhi's Triangles 题意:给出n个木棍的长度,然后问这些木棍所能组成三角形的最大面积. 分析:这个题目用状态压缩解,因为木棍的最大个数为12 我们枚举所有状态,用状态对应位的 0 和 1 表示这个木棍是否选择,然后如果某个状态选择的木棍是3的话,判断是否可以组成,可以的话dp[st] = 三角形面积 然后大于三的,分解之后得出转移方程dp[st] = max(dp[st],dp[i] + dp[st - i]) (i | (st

hdu5135 Little Zu Chongzhi&#39;s Triangles(DP)

该题其实是个DP,可能数据比较水,队友排序后从大的开始取都过了.. 我们来说说正解,一开始其实我已经写出来了,只是有一个地方导致了一直在输出一个不是数字的值,赛后才发现是我用memset对一个double类型的数组清-1的原因   ,改了一下就对了 .    直接开一维数组,用二进制表示集合的方法来表示哪些木棍被选取了 . 很简单的状态压缩DP . 另外需要注意一点: 位运算符的优先级比较低,所以在不确定的情况下要多加括号 ~ 我用的记忆化搜索,该题还可以用三重循环地推的方式求 . 细节参见代码

hdu 5135 Little Zu Chongzhi&#39;s Triangles 状压DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5135 从大到小贪心是不对的! 比如 4 30 40 50 89 这组数据 结果应该是600 如果取后三条边只会是一个细长细长的三角形根本没多大面积 只不过因为数据水然后贪心碰巧能过而已 看到网上题解很多人用贪心我好郁闷... 状压DP 看到边的数目很少就应该想到这个了 先枚举可能出现的所有三角形 记录他们使用了那些边还有他们的面积 然后再枚举状态之中 套一层遍历所有三角形的循环 如果当前状态和三角形

hdu 5135 Little Zu Chongzhi&#39;s Triangles

http://acm.hdu.edu.cn/showproblem.php?pid=5135 题意:给你N个木棍的长度,然后让你组成三角形,问你组成的三角形的和最大是多少? 思路:先求出可以组成的所有的三角形,然后状压dp就可以.求所有的三角形也可以用状压,也可以三重循环求. 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 #define

HDU 5135 Little Zu Chongzhi&#39;s Triangles (14广州 状压dp)

Little Zu Chongzhi's Triangles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 474    Accepted Submission(s): 252 Problem Description Zu Chongzhi (429–500) was a prominent Chinese mathematici

HDU 5135 Little Zu Chongzhi&#39;s Triangles(状态压缩dp+Vector)

这道题是水题,当时直接贪心就过了. 多阶段决策,其实应该用dp,他人的代码使用Vector进行预处理. #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> using namespace std; int n, a[12]; double dp[1<<12]; double cal(int a, int b, i