Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

水果

Posted by KatrineYang at 2016-09-06 23:10:50 on Problem 1267
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
using namespace std;

const double PI = 3.1415926535898;
const double EPSILON = 1e-15;

int main() {
	int num;
	scanf("%d", &num);
	int bc[110];
	for(int i = 0; i < num; i++) scanf("%d", &bc[i]);
	sort(bc, bc+num);
	int sum = 0;
	for(int i = 0; i < num-1; i++){
		sum += bc[i];
	}
	if(sum <= bc[num-1]){
		printf("0.00\n");
		return 0;
	}
	double r = bc[num-1] * 0.5;
	double s = 0;
	for(int i = 0; i < num-1; i++) s += asin(bc[i]/2.0/r);
	if(abs(s-PI/2) < EPSILON) {
		//圆心在最大边上
		double area = 0;
		for(int i = 0; i < num-1; i++) area += (bc[i]*0.5)*sqrt(r*r-bc[i]*bc[i]/4.0);
		printf("%.2lf\n", area);
	}
	else if(s > PI/2){
		//圆心在内部
		while(1){
			r *= 2;
			double ss = 0;
			for(int i = 0; i < num; i++) ss += asin(bc[i]/2.0/r);
			if(ss < PI - EPSILON) break;
		}
		double low = r/2, up = r, R;
		bool zdl = 0;
		while(up - low > 1e-10){
			double mid = (low + up)/2;
			double ss = 0;
			for(int i = 0; i < num; i++) ss += asin(bc[i]/2.0/mid);
			if(abs(ss - PI) < EPSILON){
				zdl = 1;
				R = mid;
				break;
			}
			if(ss > PI) low = mid;
			else up = mid;
		}
		if(!zdl) R = (low + up)/2;
		double area = 0;
		for(int i = 0; i < num; i++) area += (bc[i]*0.5)*sqrt(R*R-bc[i]*bc[i]/4.0);
		printf("%.2lf\n", area);
	}
	else{
		//圆心在外部
		while(1){
			r *= 2;
			double sum = 0;
			for(int i = 0; i < num-1; i++) sum += asin(bc[i]/2.0/r);
			sum -= asin(bc[num-1]/2.0/r);
			if(sum > EPSILON) break;
		}
		double low = r/2, up = r, R;
		bool zdl = 0;
		while(up - low > 1e-10){
			double mid = (up + low)/2;
			double ss = 0;
			for(int i = 0; i < num-1; i++) ss += asin(bc[i]/2.0/mid);
			ss -= asin(bc[num-1]/2.0/mid);
			if(abs(ss) < EPSILON){
				zdl = 1;
				R = mid;
				//printf("1");
				break;
			}
			if(ss > 0) up = mid;
			else low = mid;
		}
		if(!zdl) R = (up + low)/2;
		//double ck = 0;
		//for(int i = 0; i < num-1; i++) ck += asin(bc[i]/2.0/R);
		//ck -= asin(bc[num-1]/2.0/R);
		//printf("%.16lf\n", ck);
		double area = 0;
		for(int i = 0; i < num-1; i++) area += (bc[i]*0.5)*sqrt(R*R-bc[i]*bc[i]/4.0);
		area -= (bc[num-1]*0.5)*sqrt(R*R-bc[num-1]*bc[num-1]/4.0);
		printf("%.2lf\n", area);
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator