题解 | #山寨金闪闪#

山寨金闪闪

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
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务