腾讯开发岗笔试题解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-19 22:44
厉害了
点赞 回复 分享
发布于 2018-04-16 20:41
第三题题目有点忘了 有哪个记下来的老哥能发一下吗
点赞 回复 分享
发布于 2018-04-07 22:17
求指导,第二题你的dp为啥  d[i][0]==1 为什么要初始化为1呢
点赞 回复 分享
发布于 2018-04-07 11:05
你们都是大三的吗😊
点赞 回复 分享
发布于 2018-04-06 17:15
第二题我用排列组合写了下 package tencent; import java.util.Scanner; public class Dpstrk{          public static void main(String[] args){                  Scanner scan = new Scanner(System.in);         int k = scan.nextInt();         int a = scan.nextInt();         int x = scan.nextInt();         int b = scan.nextInt();         int y = scan.nextInt();                  System.out.print(getInt(k, a, x, b, y));         scan.close();     }          public static int  getInt(int k,int a,int x,int b,int y){         int d=0;         int count = 0;         if(a*x<k)               d = x;         else              d = k/a;// 歌曲A的个数         for(int i =0;i<=d;i++){             int cb = (k-i*a)/b;             if(cb>y||(k-i*a)%b !=0)//注意y的选择和整除                 continue;             count += (getjs(x)/(getjs(i)*getjs(x-i))* getjs(y)/(getjs(cb)*getjs(y-cb)))%1000000007;         }                  return count;     }          public static int getjs(int n){         if(n==0)              return 1;         int cj = 1;         for(int i=1;i<=n;i++){                          cj *= i;         }         return cj;              } }
点赞 回复 分享
发布于 2018-04-06 17:09
第二题 暴力+卢卡斯模板  80%,但是仔细看了看没有地方超时了啊
点赞 回复 分享
发布于 2018-04-06 13:26
第二题里  else if (i <= X+Y)这个判断条件为什么不是(i>X&&i<=X+Y)
点赞 回复 分享
发布于 2018-04-06 11:34
第二题dp:每次新增一个可用的歌词,可以选择不用这个歌词参与组合(dp[i - 1][j]),也可以选择用这个歌词,那么需要和j - A或j - B的长度进行组合(dp[i - 1][j - A or B])
点赞 回复 分享
发布于 2018-04-05 22:46
楼主可以解释一下dp吗
点赞 回复 分享
发布于 2018-04-05 21:05
第二题编程题: 当i= 1,j=1时,dp[1][1] = dp[0][1],可是dp[0][1]还没有值啊?请问这是什么情况?
点赞 回复 分享
发布于 2018-04-05 20:46
第三题贪心解法是错的。数据太水被骗Ac了吧。。。       
点赞 回复 分享
发布于 2018-04-05 19:14
这代码写的好看
点赞 回复 分享
发布于 2018-04-05 18:19
求大佬解释第二道dp的横纵坐标代表什么?
点赞 回复 分享
发布于 2018-04-05 17:59
什么是dp
点赞 回复 分享
发布于 2018-04-05 17:54
第二题组合数算了半天,没想到用DP快很多,大佬
点赞 回复 分享
发布于 2018-04-05 17:33
大佬,我就没想过dp
点赞 回复 分享
发布于 2018-04-05 17:31
第三题保证贪心是对的吗? 感觉应该是二分图带权匹配KM算法,但是时间复杂度不对
点赞 回复 分享
发布于 2018-04-05 17:30

相关推荐

大猪蹄子哥:1-谁教你这么写教育经历的……咱都这个学历了,很多公司要看本科、硕士,Gap Year的,你啪就给一个上大26届硕士,没了。 2-那堆奖学金揉成一行放最后得了,放前面显得你没技术自信,还是那句话,对于咱这个学历直接上重点,你这上半段看起来像个大专(无恶意 3-专业技能最好点出来细化方向,你熟悉的以太网是UDP还是TCP,是千兆还是万兆等等,多种信号处理……那你倒是说两个啊,后面空着干嘛,会的干嘛不讲 4-项目经历废话太多,描述不专业(怎么还有我,我们这种词),没有数据支撑(是婴儿还是巨人看不出来)。最后如果这些是真的XX项目、比赛,最好点出来,不然更显得像自学着玩的,或者说抄的(经典复现等于我做过 5-个人总结在咱这个分段没用
点赞 评论 收藏
分享
劝退式:感觉有人回才是不正常的
点赞 评论 收藏
分享
评论
点赞
85
分享

创作者周榜

更多
牛客网
牛客企业服务