luogu P1284 三角形牧场

题目描述

和所有人一样,奶牛喜欢变化。它们正在设想新造型的牧场。奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场。她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有的木板围成一个三角形使得牧场面积最大。

请帮助Hei小姐构造这样的牧场,并计算出这个最大牧场的面积。

输入输出格式

输入格式:

第1行:一个整数N

第2..N+1行:每行包含一个整数,即是木板长度。

输出格式:

仅一个整数:最大牧场面积乘以100然后舍尾的结果。如果无法构建,输出-1。

输入输出样例

输入样例#1:

5
1
1
3
3
4

输出样例#1:

692

说明

样例解释:692=舍尾后的(100×三角形面积),此三角形为等边三角形,边长为4。

dp j k 表示一条边为j一条边为k

推出所有可能状态,检验该状态是否能构成三角形

能的话计算返回面积,否则返回-1;

注意ans初值设为-1

#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

int a[56];
int n,sum;
double dp[1607][1607];
double calc(int a,int b,int c)
{
    if(c==0||a+b<=c||b+c<=a||a+c<=b)return -1;
    double len=(a+b+c)/2.0;
    return (double)100*sqrt(len*(len-a)*(len-b)*(len-c));
}
int main()
{
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",a+i),sum+=a[i];
    double ans=-1.0;
    dp[0][0]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=sum;j>=0;j--)
            for(int k=sum;k>=0;k--)
            {
                if(j>=a[i])
                    if(dp[j-a[i]][k])dp[j][k]=1;
                if(k>=a[i])
                    if(dp[j][k-a[i]])dp[j][k]=1;
                if(i==n&&j&&k&&dp[j][k])
                    ans=max(ans,calc(j,k,sum-j-k));
            }
    }
    printf("%d\n",int(ans));
    return 0;
}
时间: 2024-12-24 22:44:15

luogu P1284 三角形牧场的相关文章

洛谷 P1284 三角形牧场WD

P1284 三角形牧场 题目描述 和所有人一样,奶牛喜欢变化.它们正在设想新造型的牧场.奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场.她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有的木板围成一个三角形使得牧场面积最大. 请帮助Hei小姐构造这样的牧场,并计算出这个最大牧场的面积. 输入输出格式 输入格式: 第1行:一个整数N 第2..N+1行:每行包含一个整数,即是木板长度. 输出格式: 仅一个整数:最大牧场面积乘以100然后舍尾的结果.如果无法构建,

P1284 三角形牧场

题目描述 和所有人一样,奶牛喜欢变化.它们正在设想新造型的牧场.奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场.她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有的木板围成一个三角形使得牧场面积最大. 请帮助Hei小姐构造这样的牧场,并计算出这个最大牧场的面积. 输入输出格式 输入格式: 第1行:一个整数N 第2..N+1行:每行包含一个整数,即是木板长度. 输出格式: 仅一个整数:最大牧场面积乘以100然后舍尾的结果.如果无法构建,输出-1. 输入输出样例

洛谷 P1284 三角形牧场

题目描述 和所有人一样,奶牛喜欢变化.它们正在设想新造型的牧场.奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场.她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有的木板围成一个三角形使得牧场面积最大. 请帮助Hei小姐构造这样的牧场,并计算出这个最大牧场的面积. 输入输出格式 输入格式: 第1行:一个整数N 第2..N+1行:每行包含一个整数,即是木板长度. 输出格式: 仅一个整数:最大牧场面积乘以100然后舍尾的结果.如果无法构建,输出-1. 输入输出样例

洛谷P1284 三角形牧场

题目描述 和所有人一样,奶牛喜欢变化.它们正在设想新造型的牧场.奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场.她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有的木板围成一个三角形使得牧场面积最大. 请帮助Hei小姐构造这样的牧场,并计算出这个最大牧场的面积. 输入输出格式 输入格式: 第1行:一个整数N 第2..N+1行:每行包含一个整数,即是木板长度. 输出格式: 仅一个整数:最大牧场面积乘以100然后舍尾的结果.如果无法构建,输出-1. 输入输出样例

洛谷1284 三角形牧场

本题地址:http://www.luogu.org/problem/show?pid=1284 题目描述 和所有人一样,奶牛喜欢变化.它们正在设想新造型的牧场.奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场.她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有的木板围成一个三角形使得牧场面积最大.     请帮助Hei小姐构造这样的牧场,并计算出这个最大牧场的面积. 输入输出格式 输入格式: 第1行:一个整数N 第2..N+1行:每行包含一个整数,即是木板长度

【Luogu】P2912牧场散步(TarjanLCA)

题目链接 老天--终于碰上一个除了模板之外的LCA题了 这道题用Tarjan来LCA.树上两个点的路径是唯一的,所以钦定一个根,两点间的路径就是两点到根的路径减去双倍的公共祖先到根的路径.大概很好理解. #include<cstdio> #include<cctype> #include<cstring> #include<iostream> using namespace std; inline long long read(){ long long nu

【动态规划/二维背包问题】mr355-三角形牧场

应该也是USACO的题目?同样没有找到具体出处. [题目大意] 和所有人一样,奶牛喜欢变化.它们正在设想新造型牧场.奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场.她拥有N(3≤N≤40)块木板,每块的长度L(1≤L≤40)都是整数,她想用所有的木板围成一个三角形使得牧场面积最大. 请帮助Hei小姐构造这样的牧场,并计算出这个最大牧场的面积. [输入] 第1行:一个整数N. 第2行起:包含N个用空格分隔的整数,即是每块木板的长度. [输出] 仅一个整数:最大牧场面积乘以100然后舍尾的结果.

USACO月赛—JAN12 Silver

题目描述 After several years of record milk production, Farmer John now operates an entire network of N farms (1 <= N <= 100). Farm i is located at position (x_i, y_i) in the 2D plane, distinct from all other farms, with both x_i and y_i being integers.

10.11考试总结

10.11考试总结 全是DP实际上发现暴力也能有部分分....... 三角形牧场 DP......当时总是感觉不像啊 需要处理的就是枚举三角形边长可能出现的情况.因为周长在输入端时候就可以确定了,所以只需要通过枚举两条边就可以强行算出第三条边..... 所以就省空间+时间.... f[0][0] = 1; for (int i=1; i<=n; ++i) for(int j=half; j>=0; j--) for(int k=j; k>=0; k--) if(j >= d[i]