腾讯开发岗笔试题解Java

第一题:就是一个找规律

public class Q1 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long n = sc.nextInt();
        long m = sc.nextInt();
        long count = m * m;
        long sum = n / (2 * m) * count;
        System.out.println(sum);
    }
}

第二题:dp

public class Q2 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int K = sc.nextInt();
        int A = sc.nextInt();
        int X = sc.nextInt();
        int B = sc.nextInt();
        int Y = sc.nextInt();

        int[][] dp = new int[X+Y+1][K+1];

        for (int i = 0; i < X+Y+1; i++)
            dp[i][0] = 1;

        for (int i = 1; i < X+Y+1; i++) {
            for (int j = 1; j <= K; j++) {
                if (i <= X) {
                    if (j >= A) dp[i][j] = (dp[i-1][j] + dp[i-1][j-A]) % 1000000007;
                    else dp[i][j] = dp[i-1][j] % 1000000007;
                }
                else if (i <= X+Y) {
                    if (j >= B) dp[i][j] = (dp[i-1][j] + dp[i-1][j-B]) % 1000000007;
                    else dp[i][j] = dp[i-1][j] % 1000000007;
                }
            }
        }

        System.out.println(dp[X+Y][K]);

    }
}

第三题:贪心,排序求和

public class Q3 {

    static class Pair {
        int time;
        int level;

        public Pair(int time, int level) {
            this.time = time;
            this.level = level;
        }
    }


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

        Pair[] machine = new Pair[n];
        Pair[] task = new Pair[m];

        // input
        for (int i = 0; i < n; i++)
            machine[i] = new Pair(sc.nextInt(), sc.nextInt());
        for (int i = 0; i < m; i++)
            task[i] = new Pair(sc.nextInt(), sc.nextInt());
        int[] cnt = new int[105];

        // sort
        Comparator<Pair> comparator = (a, b) -> {
            if (a.time == b.time)   return b.level - a.level;
            else return b.time - a.time;
        };
        Arrays.sort(machine, comparator);
        Arrays.sort(task, comparator);

        long sum = 0;

        int j = 0, cnt1 = 0;
        for(int i = 0;i < m;i++) {
            while(j < n && machine[j].time >= task[i].time) {
                  cnt[machine[j].level]++;
                  j++;
            }
            for(int k = task[i].level; k < 101; k++) {
                if(cnt[k] != 0) {
                    cnt[k]--;
                    sum += 200*task[i].time + 3*task[i].level;
                    cnt1++;
                    break;
                }
            }
        }
        System.out.println(cnt1 + " " + sum);
    }
}
#笔试题目##腾讯##Java#
全部评论
import java.util.Arrays; //第二题:照着大神改的小demo,加了点注释. //dp[i][j] 行,当前歌曲,列,所求和,值,选择数  //dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - A]) //和为k的选择数 = 放x前的 和为k的选择数 + 放x前的 和为(k-x) 的选择数.  //i-1代表放x前,即上一次. j-a 代表和为k-x public class Main2_2 {     public static void main(String[] args) {         int K = 5;         int A = 2;         int X = 3;// X首长度为A的         int B = 3;         int Y = 3; // Y首长度为B的         // - 0 1 2 3 4 5 (k)         // 0         // 2         // 2         // 2         // 3         // 3         // (X+Y)         int dp[][] = new int[X + Y + 1][K + 1];         // 初始化         for (int i = 0; i < X + Y + 1; i++) {             dp[i][0] = 1;         }         for (int i = 1; i < X + Y + 1; i++) {             for (int j = 1; j < K + 1; j++) {                 if (i <= X) {                     if (j < A) {                         // 在不能放A的时候:J-A越界了怎么办                         dp[i][j] = dp[i - 1][j];                     } else {                         // i<=X 就要-A                         dp[i][j] = dp[i - 1][j] + dp[i - 1][j - A];                     }                 } else {                     if (j < B) {                         // 在不能放B的时候:J-B越界了怎么办                         dp[i][j] = dp[i - 1][j];                     } else {                         // X<=i<=X+Y+1 就要-B                         dp[i][j] = dp[i - 1][j] + dp[i - 1][j - B];                     }                 }             }         }         for (int i = 0; i < X + Y + 1; i++) {             System.out.println(Arrays.toString(dp[i]));         }     } }
点赞 回复
分享
发布于 2018-04-08 17:27
第二道用了广度搜索,凉凉
点赞 回复
分享
发布于 2018-04-05 17:28
联易融
校招火热招聘中
官网直投
大佬
点赞 回复
分享
发布于 2018-04-05 16:58
It's coooooool~~~
点赞 回复
分享
发布于 2018-04-05 16:59
第一题我 n*m/2 没通过 ,搞不懂
点赞 回复
分享
发布于 2018-04-05 17:00
给大佬跪了
点赞 回复
分享
发布于 2018-04-05 17:02
校友啊
点赞 回复
分享
发布于 2018-04-05 17:03
膜拜啊,大神
点赞 回复
分享
发布于 2018-04-05 17:04
给大佬跪了
点赞 回复
分享
发布于 2018-04-05 17:05
第三题,用收益排序,凉凉
点赞 回复
分享
发布于 2018-04-05 17:06
都对了多少
点赞 回复
分享
发布于 2018-04-05 17:09
第二题直接用A*m+B*n == k 然后C(n,X)*C(m,Y)每一步都取模了,后面的用例为什么过不了?楼下有这样做的么?
点赞 回复
分享
发布于 2018-04-05 17:14
我的三道题顺序反一下的,做第一题时感觉很刺激
点赞 回复
分享
发布于 2018-04-05 17:21
第三题保证贪心是对的吗? 感觉应该是二分图带权匹配KM算法,但是时间复杂度不对
点赞 回复
分享
发布于 2018-04-05 17:30
大佬,我就没想过dp
点赞 回复
分享
发布于 2018-04-05 17:31
第二题组合数算了半天,没想到用DP快很多,大佬
点赞 回复
分享
发布于 2018-04-05 17:33
什么是dp
点赞 回复
分享
发布于 2018-04-05 17:54
求大佬解释第二道dp的横纵坐标代表什么?
点赞 回复
分享
发布于 2018-04-05 17:59
这代码写的好看
点赞 回复
分享
发布于 2018-04-05 18:19
第三题贪心解法是错的。数据太水被骗Ac了吧。。。       
点赞 回复
分享
发布于 2018-04-05 19:14

相关推荐

头像
不愿透露姓名的神秘牛友
03-13 14:57
点赞 评论 收藏
转发
点赞 85 评论
分享
牛客网
牛客企业服务