大佬求助,不用判断3边关系也能A?
查看原帖
大佬求助,不用判断3边关系也能A?
265978
Retired楼主2022/7/14 20:59
/*
A: 10min
B: 20min
C: 30min
D: 40min
*/ 
#include <iostream>
#include <stack>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <sstream>
#define pb push_back 
#define all(x) (x).begin(),(x).end()
#define mem(f, x) memset(f,x,sizeof(f)) 
#define fo(i,a,n) for(int i=(a);i<=(n);++i)
#define fo_(i,a,n) for(int i=(a);i<(n);++i)
#define debug(x) cout<<#x<<":"<<x<<endl;
#define endl '\n'
using namespace std;
//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

template<typename T>
ostream& operator<<(ostream& os,const vector<T>&v){for(int i=0,j=0;i<v.size();i++,j++)if(j>=5){j=0;puts("");}else os<<v[i]<<" ";return os;}
template<typename T>
ostream& operator<<(ostream& os,const set<T>&v){for(auto c:v)os<<c<<" ";return os;}
template<typename T1,typename T2>
ostream& operator<<(ostream& os,const map<T1,T2>&v){for(auto c:v)os<<c.first<<" "<<c.second<<endl;return os;}
template<typename T>inline void rd(T &a) {
    char c = getchar(); T x = 0, f = 1; while (!isdigit(c)) {if (c == '-')f = -1; c = getchar();}
    while (isdigit(c)) {x = (x << 1) + (x << 3) + c - '0'; c = getchar();} a = f * x;
}

typedef pair<int,int>PII;
typedef pair<long,long>PLL;

typedef long long ll;
typedef unsigned long long ull; 
const int N=1e6+10;
int n,m,_;
int a[50],f[50][810][810];
double ans,sum;
double area(double a,double b){
    double c = sum-a-b;
    double p = (a+b+c)/2;
    double s = sqrt(p*(p-a)*(p-b)*(p-c));
    return s;
}

void solve(){
    cin>>n;
    fo(i,1,n){
        cin>>a[i];
        sum+=a[i];
    }
    f[0][0][0]=1;
    for(int i=1;i<=n;i++){
        for(int j=sum/2;j>=0;j--){
            for(int k=sum/2;k>=0;k--){
                f[i][j][k] |= f[i-1][j][k];
                if(j-a[i]>=0){
                    f[i][j][k] |= f[i-1][j-a[i]][k];
                }
                if(k-a[i]>=0){
                    f[i][j][k] |= f[i-1][j][k-a[i]];
                }
            }
        }
    }
    ans = -1;
	for(int k=1;k<=n;k++){
		for(int i=sum/2;i>0;i--)
			for(int j=sum/2;j>0;j--)
			{
				if(!f[k][i][j]) continue;
				ans=max(ans,area(i,j));//更新答案 
			}
	}
	if(ans!=-1){
		cout<<(ll)(ans*100)<<endl;		
	}
	else
    cout<<ans<<endl;
}

int main(){
	solve();
	return 0;
}
2022/7/14 20:59
加载中...