2 条题解

  • 0
    @ 2025-10-8 17:00:48

    by hansang:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=45, M=1620;
    int a[N], f[2][M][M];
    bool pd(int i, int j, int k){
    	if(i+j<=k || abs(i-j)>=k) return 0;
    	if(i+k<=j || abs(i-k)>=j) return 0;
    	if(j+k<=i || abs(k-j)>=i) return 0;
    	if((i<=0) || (j<=0) || (k<=0)) return 0;
    	return 1;
    }
    double calc(double i, double j, double k){
    	double p=(i+j+k)/2;
    	double res=sqrt(p*(p-i)*(p-j)*(p-k))*100.0;
    	return res;
    }
    int main(){
    	int n, sum=0; scanf("%d", &n);
    	for(int i=1; i<=n; i++){
    		scanf("%d", &a[i]);
    		sum+=a[i];
    	}
    	double ans=0;
    	memset(f, 0, sizeof(f)); f[0][0][0]=1;
    	for(int i=1; i<=n; i++){
    		for(int j=0; j<=sum/2; j++){
    			for(int k=0; k<=sum/2; k++) if(f[(i-1)&1][j][k]){
    				f[i&1][j+a[i]][k]=1;
    				f[i&1][j][k+a[i]]=1;
    				f[i&1][j][k]=1; 
    				
    				int t=sum-k-j-a[i];
    				if(pd(j+a[i], k, t)) ans=max(ans, calc(j+a[i], k, t));
    				if(pd(j, k+a[i], t)) ans=max(ans, calc(j, k+a[i], t));
    			}
    		}
    	}
    	printf("%d\n", (!ans)? -1: (int)ans);
    	return 0;
    }
    
    • 0
      @ 2025-10-8 17:00:37

      by hansang:

      #include<bits/stdc++.h>
      using namespace std;
      const int N=45, M=1620;
      int a[N], f[2][M][M];
      bool pd(int i, int j, int k){
      	if(i+j<=k || abs(i-j)>=k) return 0;
      	if(i+k<=j || abs(i-k)>=j) return 0;
      	if(j+k<=i || abs(k-j)>=i) return 0;
      	if((i<=0) || (j<=0) || (k<=0)) return 0;
      	return 1;
      }
      double calc(double i, double j, double k){
      	double p=(i+j+k)/2;
      	double res=sqrt(p*(p-i)*(p-j)*(p-k))*100.0;
      	return res;
      }
      int main(){
      	int n, sum=0; scanf("%d", &n);
      	for(int i=1; i<=n; i++){
      		scanf("%d", &a[i]);
      		sum+=a[i];
      	}
      	double ans=0;
      	memset(f, 0, sizeof(f)); f[0][0][0]=1;
      	for(int i=1; i<=n; i++){
      		for(int j=0; j<=sum/2; j++){
      			for(int k=0; k<=sum/2; k++) if(f[(i-1)&1][j][k]){
      				f[i&1][j+a[i]][k]=1;
      				f[i&1][j][k+a[i]]=1;
      				f[i&1][j][k]=1; 
      				
      				int t=sum-k-j-a[i];
      				if(pd(j+a[i], k, t)) ans=max(ans, calc(j+a[i], k, t));
      				if(pd(j, k+a[i], t)) ans=max(ans, calc(j, k+a[i], t));
      			}
      		}
      	}
      	printf("%d\n", (!ans)? -1: (int)ans);
      	return 0;
      } 
      • 1

      USACO(118)动态规划(背包型)6:三角牧场POJ1948 [USACO02NOV] Triangular Pasture

      信息

      ID
      2309
      时间
      1000ms
      内存
      128MiB
      难度
      8
      标签
      递交数
      26
      已通过
      6
      上传者