//解题关键:(区间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
}


京公网安备 11010502036488号