台州 OJ 1554 Triangular Pastures

题目意思是,有 n 个栅栏,每个栅栏的长度给出了,要求用这 n 个栅栏构成三角形,求面积最大的

开先没看懂题目意思,不知道 n 个栅栏全部要用上。思路就是把两条边枚举出来,第三条边就知道了,然后把能构成三角形的面积都算出来,取最大值。

代码:

#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;

const int MAX = 1600;

int n;
int dp[MAX][MAX];
int v[MAX];

int getArea(int a, int b, int c);

int main(){
//    freopen("input.txt", "r", stdin);
    
    int maxn = 0;
    cin >> n;
    for(int i=1; i<=n; i++){
        cin >> v[i];
        maxn += v[i];
    } 
    
    //枚举出两条边的所有值 
    memset(dp, 0, sizeof(dp));
    dp[0][0] = 1;
    for(int i=1; i<=n; i++){
        for(int j=maxn; j>=0; j--){
            for(int k=maxn; k>=0; k--){
                if(dp[j][k]){
                    dp[j+v[i]][k] = 1;
                    dp[j][k+v[i]] = 1;
                }
            }
        }
    }
    
    //求面积最大的 
    int ans = -1;
    for(int i=1; i<maxn; i++){
        for(int j=1; j<maxn; j++){
            if(dp[i][j]){
                int k = maxn - i - j;
                if(i + j <= k || i + k <= j || j + k <= i)
                    continue;
                ans = max(ans, getArea(i, j, k));
            }
        }
    }
    
    cout << ans;
    
    return 0;
}

int getArea(int a, int b, int c){
    double p = (a + b + c)*1.0 / 2;
    return sqrt(p*(p-a)*(p-b)*(p-c)) * 100;
}

 

posted @ 2017-07-31 20:37  淡蓝色光  阅读(127)  评论(0编辑  收藏  举报