每个测试文件均包含多组测试数据。第一行输入一个整数
代表数据组数,每组测试数据描述如下:
第一行输入一个整数
代表棍子的种类。
此后
行,第
行输入两个整数
代表第
种棍子的长度和数量。
除此之外,保证单个测试文件的
之和不超过
。
在一行上输出一个实数,代表组成的最大等腰三角形的面积。如果无法组成等腰三角形,则直接输出
。
由于实数的计算存在误差,当误差的量级不超过
时,您的答案都将被接受。具体来说,设您的答案为
,标准答案为
,当且仅当
时,您的答案将被接受。
2 3 3 3 2 1 3 1 2 1 2 12 1
3.89711431702997391060 -1
对于第一组测试数据,可以构造
为底、
为腰的三角形,面积
;也可以构造
为底、
为腰的三角形,面积
。显然,后者更大。
本题数据量较大,我们建议您使用较快的读入方式。
package main import ( "fmt" "math" "sort" ) func CalulateIsosceLestriangleSpare(LenIso float64, LenDown float64) float64 { //fmt.Println(LenIso, LenDown) h := math.Sqrt(LenIso*LenIso - LenDown/2.0*LenDown/2.0) return h * LenDown / 2.0 } func IsConstructTriangle(LenIso float64, LenDown float64) bool { if LenIso*2.0 > LenDown { return true } return false } func SortAndDelCopyer(PIAArr [][]float64) [][]float64 { DCDict := make(map[float64]float64) for _, v := range PIAArr { item, err := DCDict[v[0]] if err { DCDict[v[0]] = item + v[1] } else { DCDict[v[0]] = v[1] } } var PIA [][]float64 for v := range DCDict { PIA = append(PIA, []float64{v, DCDict[v]}) } PIAArr = PIA sort.Slice(PIAArr, func(i, j int) bool { return PIAArr[i][0] > PIAArr[j][0] }) //fmt.Println("SortAndDelCopyer", PIAArr) return PIAArr } func main() { var num int var HandleArr [][][]float64 fmt.Scan(&num) for i := 0; i < num; i++ { var itemnum int fmt.Scan(&itemnum) var item [][]float64 for j := 0; j < itemnum; j++ { var lenger, number float64 fmt.Scanf("%f %f", &lenger, &number) item = append(item, []float64{lenger, number}) } HandleArr = append(HandleArr, item) } flag := 0 for _, v := range HandleArr { v = SortAndDelCopyer(v) //fmt.Println(v) flag = 0 for i := 0; i < len(v); i++ { if v[i][1] >= 3 { flag = 1 fmt.Printf("%.10f\n", CalulateIsosceLestriangleSpare(v[i][0], v[i][0])) break } else if v[i][1] == 2 { for j := i - 1; j >= 0; j-- { if IsConstructTriangle(v[i][0], v[j][0]) { fmt.Printf("%.10f\n", CalulateIsosceLestriangleSpare(v[i][0], v[j][0])) flag = 1 break } } if flag == 1 { break } if i != len(v)-1 { if IsConstructTriangle(v[i][0], v[i+1][0]) { fmt.Printf("%.10f\n",CalulateIsosceLestriangleSpare(v[i][0], v[i+1][0])) flag = 1 break } } if flag == 1 { break } continue } } if flag == 0 { fmt.Println(-1) } } }