携程0313 笔试 总共80分?

第三 1,质数因子个数+最小子数组和

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    static int[] b = new int[10001];

    static {
        /**计算出1-10000所有的质数 埃氏筛 */
        boolean[]isP = new boolean[10001];
        Arrays.fill(isP, true);

        //取出下一个质数,所有该质数的倍数去掉

        for (int i = 2; i <= 10000; i++) {
            if (!isP[i])continue;
            /**质数 i*/
            for (int k = 2; k * i <= 10000; k++)isP[k * i] = false;
        }
        isP[1] = false;
        isP[0] = false;

        /**所有的数字的权值(质因子个数) */
        for (int j = 2; j <= 10000; j++) {
            if (isP[j])
                for (int p = 1; p * j <= 10000; p++)b[p * j]++;
        }
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), k = in.nextInt();
        int[]a = new int[n];
        for (int i = 0; i < n; i++)a[i] = in.nextInt();
        /**
          删除权值和最小的子数组 ===>前缀和
          计算出前缀 权值和
         */
        int[]pre = new int[n + 1];
        for (int i = 0; i < n; i++) {
            pre[i + 1] = pre[i] + b[a[i]];
        }

        int mn = pre[n];

        for (int st = 0; st + k - 1 <= n - 1; st++) {
            int o = pre[st + k] - pre[st];
            mn = Math.min(mn, o);
        }
        System.out.print(pre[n] - mn);
    }
}

第四 0.94偶尔0.87,偶数路径个数,真的找不到哪里还能再快了

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息

/**
               求全为偶数的路径
        12
      /  \
    16    3
    /
  4

  long dfs(i):  i节点为终点的 偶数路径 个数
      
	  无论当前a[i]是奇数还是偶数,都需要往下继续dfs

  1.   如果i节点为奇数直接返回0,

  2.   如果i节点为偶数
          同时 ans+=  1 + sum(子节点) + sum(j1*j2,j2*j3,....)
          返回的是 1+sum(子节点)

 */

public class Main {

    public static long ans = 0;
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();


        boolean[]a = new boolean[n + 1];

        for (int i = 0; i < n; i++)a[i + 1] = in.nextInt() % 2 == 0;
        
        List<Integer>[]g = new List[n + 1];
        Arrays.setAll(g, i->new ArrayList());
        for (int i = 0; i < n - 1; i++) {
            int u = in.nextInt(), v = in.nextInt();
            g[u].add(v);
            g[v].add(u);
        }
        dfs(1, 0, g, a);
        System.out.print(ans);
    }

    public static long dfs(int i, int fa, List<Integer>[]g, boolean[]a) {
        if (g[i].size() == 1 && fa != 0) { //叶子节点直接返回
            int c = a[i] ? 1 : 0;
            ans += c;
            return c;
        }
        long res = 0;   //这个节点的返回个数
        long a1 = 0;  //用于组合计数的

        // 子节点j, 无论当前节点是否为奇数都需要往下dfs
        for (int j : g[i]) {
            if (j == fa)continue;
            long rj = dfs(j, i, g, a);
            a1 += res * rj;
            res += rj;
        }
        ans += a[i] ? 1 + res + a1 : 0;
        return a[i] ? res + 1 : 0;
    }
}

#携程求职进展汇总##牛客创作赏金赛#
全部评论
第三题,死活50%,ac不了
点赞 回复 分享
发布于 昨天 21:05 浙江

相关推荐

昨天 20:43
上海大学 Java
点赞 评论 收藏
分享
昨天 21:01
武汉大学 C++
投递携程等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
4
分享

创作者周榜

更多
牛客网
牛客企业服务