3.14IT统一校招笔试题(个人)

3.14的IT春招

第三题的动态规划后面才想出来,不知道能不能过

package 蓝桥杯;

import java.util.Scanner;

/*

  • 一条项链 有n个宝珠组成,每个宝珠的数量>=min,<=max
  • 求宝珠数量和为m的方案总数
  • 动态规划
  • 如果dp[j][i]存在那么在加一种宝珠其数量在min和max之间
  • 那么dp[]j+1][i+min]到dp[j+1][i+max]都包含dp[j][i]方案总数
  • 依次累加
  • 注意设定初始值
  • */
    public class 动态规划宝珠方案总数 {
    public static void main(String[] args) {

    Scanner in = new Scanner(System.in);
     while (in.hasNext()) {
         int n = in.nextInt();
         int m = in.nextInt();
         int[][] dp = new int[n + 1][m + 1];
         int max[] = new int[n + 1];
         int min[] = new int[n + 1];
         for (int i = 0; i < n; i++) {
             min[i + 1] = in.nextInt();
             max[i + 1] = in.nextInt();
         }
         for (int i = min[1]; i <= max[1]; i++) {
             dp[1][i] = 1;
         }
         for (int j = 1; j < n; j++) {
             for (int i = 0; (i <= m) && (dp[j][i] != 0); i++) {
    
                 for (int add = min[j]; (add <= max[j]) && (i + add <= m); add++) {
                     dp[j + 1][i + add] += dp[j][i];
    
                 }
    
             }
    
         }
         System.out.println(dp[n][m]);
     }

    }

}
第二题90%,没过,第一题应该是求最小连通子图,暂时没有易于实现的方法

#笔试题目##校招#
全部评论
第一题看半天不知道干嘛,一开始一直以为是直线,结果发现是图啊。然后就很清楚了,最小生成树就是了。 第二题,先排序,然后DP,要开long long。我始也90% 第三题 也是DP啊。
点赞
送花
回复
分享
发布于 2018-03-15 14:37
it是啥
点赞
送花
回复
分享
发布于 2018-03-15 14:41
滴滴
校招火热招聘中
官网直投
2018年校招全国统一模拟笔试(第一场)编程题 https://www.nowcoder.com/test/9439037/summary 这里可以练习了
点赞
送花
回复
分享
发布于 2018-03-15 14:52
还有问题 ,有时间再改进下
点赞
送花
回复
分享
发布于 2018-03-16 10:21
import java.util.Scanner; public class Main{     public static void main(String[] args) {         Scanner in = new Scanner(System.in);  while (in.hasNext()) {      int n = in.nextInt();      int m = in.nextInt();      int[][] dp = new int[n + 1][m + 1];      int max[] = new int[n + 1];      int min[] = new int[n + 1];      for (int i = 0; i < n; i++) {          min[i + 1] = in.nextInt();          max[i + 1] = in.nextInt();      }      for (int i = min[1]; i <= max[1]; i++) {          dp[1][i] = 1;      }      for (int j = 1; j < n; j++) {          for (int i = 0; i <= m; i++) {                     if(dp[j][i] != 0){                    for (int add = min[j]; (add <= max[j]) && (i + add <= m); add++) {                  dp[j + 1][i + add] += dp[j][i];                }                     }                         }        }      System.out.println(dp[n][m]);  }     } }
点赞
送花
回复
分享
发布于 2018-03-16 10:25

相关推荐

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