首页 > 网易笔试(凉)
头像
emptyCoder
编辑于 2020-08-10 19:39
+ 关注

网易笔试(凉)

Q1: 对于给定数组a(n<=1e6),每个元素(a[i]<=1e9)可拆成素数,求拆完后最多有多少个素数

分奇偶讨论即可
1、a[i]为偶,可最多拆成a[i]/2个素数(2)
2、为奇(>=3),1(1个3)+(a[i]-3)/2为最多,简单化简得a[i]/2

Q2:给定n(1~n),然后从中指定m个数为其子序列,求符合条件的n个数的最小字典序

// 双指针即可,一个数组为m指示的数,一个为n-m剩下的数,每次取最小
package main

import "fmt"

func main() {
    var n, m int
    sn, sm := []int{}, []int{}
    fmt.Scan(&n, &m)
    //vis := [100005]bool{}  才10万就爆内存,无法理解啊!!!
    vis := make([]bool, n+1)

    var v int
    for i := 1; i <= m; i++ {
        fmt.Scan(&v)
        sm = append(sm, v)
        vis[v] = true
    }
    for i := 1; i <= n; i++ {
        if !vis[i] {
            sn = append(sn, i)
        }
    }

    // 双指针
    ans := []int{}
    leftn, leftm := 0, 0
    for leftn < len(sn) && leftm < len(sm) {
        if sn[leftn] < sm[leftm] {
            ans = append(ans, sn[leftn])
            leftn++
        } else {
            ans = append(ans, sm[leftm])
            leftm++
        }
    }
    if leftn < len(sn) { // error for
        ans = append(ans, sn[leftn:]...)
    }
    if leftm < len(sm) {
        ans = append(ans, sm[leftm:]...)
    }
    // show
    fmt.Print(ans[0])
    for i := 1; i < len(ans); i++ {
        fmt.Printf(" %d", ans[i])
    }
}

Q3: N份(<=15)食物,各有其美味度(<=100000),求最少舍去食物以确保两人能获得价值美味度一样(不要求食物份数一样)

1、朴素解法:每份食物或不分(即舍去)或给A或给B,3^15=14348907,而且当时应该也是可以过的,只是程序中作为全局结果变量和局部变量混淆使用导致丢分
package main

import "fmt"

var ans int

func main() {
    var T, N int
    a := [15]int{}
    fmt.Scan(&T)
    for i := 1; i <= T; i++ {
        //ans, s := 1500000, 0  这里 ans 不能和 s 一起初始化,和全局变量混淆,导致 dfs 中 ans 更新失败!!!
        ans = 1500000
        s := 0
        fmt.Scan(&N)
        for k := 0; k < N; k++ {
            fmt.Scan(&a[k])
            s += a[k]
        }
        dfs(a[:N], s, 0, 0, 0) // 这里要限定 a 的大小为 N
        fmt.Println(ans)
    }
}

func dfs(a []int, s, v1, v2, i int) {
    if i == len(a) {
        if v1 == v2 {
            ans = min(ans, s-2*v1)
        }
        return
    }
    for k := i; k < len(a); k++ {
        dfs(a, s, v1, v2, k+1)
        dfs(a, s, v1+a[k], v2, k+1)
        dfs(a, s, v1, v2+a[k], k+1)
    }
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}
2、416. 分割等和子集能处理等分情况,但是不等分怎么处理暂时不明白,后续更新!!!

Q4: POJ 3522 最大边与最小边差值最小的生成树,网上解法挺多的,还在理解细节中,后续补上!!!

全部评论

(0) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐