题解 | #山寨金闪闪#
山寨金闪闪
http://www.nowcoder.com/practice/9363dcb83ca44c61a2c1a8f65aa722b8
//解题关键:(区间l,r 是武器的下标)
//1.算出l,r在什么区间,三角形是一定可以构成的,用三角形a+b == c的临界情况可用Fibonacci数列构造这题的区间,1,1,2,3,5,8,13(区间里能包含的武器长度数量;如区间长度7,只有13种武器长度,如果区间长度47,超过int32种武器长度了)...
//2.武器范围是int32,就是我们构造的数组要包含int32的范围即可,满足所有能构造三角形的情况
//3.Fibonacci数列构造到47个下标就包含了int32所有数了,即区间长度>47就能构造出这题的三角形
疯狂抄题解调试,一会就理解了,结果这题最折磨的是go的标准输入...
package main import( "fmt" "os" "bufio" "sort" "strings" "strconv" ) const maxn = 1e7+5 var reader *bufio.Reader var a [maxn]int func HasJinShanShan(l,r int) bool{ if r-l+1<3{ return false }else if r-l+1>47{ return true }else{ weapon := []int{} for i:=l; i<=r;i++{ weapon = append(weapon, a[i]) } sort.Ints(weapon) for i:=0; i<len(weapon)-2;i++{ // 前两条边大于第三条,能构成 if weapon[i]+weapon[i+1]>weapon[i+2]{ return true } } } return false } func main(){ reader = bufio.NewReader(os.Stdin) var n int nStr := splitStdString('\n') n,_ = strconv.Atoi(nStr) for i:=1; i<n; i++{ // fmt.Print(buf, " ") buf := splitStdString(' ') a[i],_ = strconv.Atoi(buf) } buf := splitStdString('\n') a[n],_ = strconv.Atoi(buf) // fmt.Println(a[:n+1]) var m int var l,r ,cnt int mStr := splitStdString('\n') m,_ = strconv.Atoi(mStr) // fmt.Println(m) for i:=0; i<m; i++{ lrStr := splitStdString('\n') lr := strings.Split(lrStr, " ") // fmt.Println("lr",lr) l,_ = strconv.Atoi(lr[0]) r,_ = strconv.Atoi(lr[1]) // fmt.Println(l,r,HasJinShanShan(l,r)) if HasJinShanShan(l,r){cnt++} } fmt.Println(cnt) } // 以split字符分割标准输入的字串 func splitStdString(split byte) string{ text,_ := reader.ReadString(split) text = strings.Trim(text, string(split)) return text }