网易2017春招笔试真题集合

1.双核处理

  • 题目:
    一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。

    • 输入包括两行:
      第一行为整数n(1 ≤ n ≤ 50)
      第二行为n个整数length[i](1024 ≤ length[i] ≤ 4194304),表示每个任务的长度为length[i]kb,每个数均为1024的倍数。
  • 题目分析:
    此题是01背包问题的变形。完成所有n个任务需要sum时间,放入两个cpu中执行,假设第一个cpu处理时间为n1,第二个cpu时间为sum-n1,并假设n1 <= sum/2,sum-n1 >= sum/2,要使处理时间最小,则n1越来越靠近sum/2,最终目标是求max(n1,sum-n1)的最大值。
    转换为01背包问题:已知最大容纳时间为sum/2,有n个任务,每个任务有其的完成时间,求最大完成时间。

01背包问题:已知背包的最大容量,有n个物品,价值分别是wi,求如何放物品能取得最大值

  • 代码:
package WangYi2017Spring;

import java.util.Scanner;

public class Main {

    public final static int MAX_N = 50+1;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n;
        int[] time = new int[MAX_N];
        int sum = 0;    //两个cpu运行的总时间


        while(sc.hasNext()){
            n = sc.nextInt();
            for(int i=0;i>10; //"每个数均为1024的倍数"
                sum += time[i];
            }

            int[] dp = new int[sum/2+1];
            for(int i=0;ifor(int j=(sum/2);j>=time[i];j--){
                    dp[j] = Math.max(dp[j],dp[j-time[i]]+time[i]);
                }
            }

            System.out.println((sum-dp[sum/2])<<10);
        }
    }
}

2.赶去公司

  • 题目:
    终于到周末啦!小易走在市区的街道上准备找朋友聚会,突然服务器发来警报,小易需要立即回公司修复这个紧急bug。假设市区是一个无限大的区域,每条街道假设坐标是(X,Y),小易当前在(0,0)街道,办公室在(gx,gy)街道上。小易周围有多个出租车打车点,小易赶去办公室有两种选择,一种就是走路去公司,另外一种就是走到一个出租车打车点,然后从打车点的位置坐出租车去公司。每次移动到相邻的街道(横向或者纵向)走路将会花费walkTime时间,打车将花费taxiTime时间。小易需要尽快赶到公司去,现在小易想知道他最快需要花费多少时间去公司。

    • 输入数据包括五行:

      第一行为周围出租车打车点的个数n(1 ≤ n ≤ 50)

      第二行为每个出租车打车点的横坐标tX[i] (-10000 ≤ tX[i] ≤ 10000)

      第三行为每个出租车打车点的纵坐标tY[i] (-10000 ≤ tY[i] ≤ 10000)

      第四行为办公室坐标gx,gy(-10000 ≤ gx,gy ≤ 10000),以空格分隔

      第五行为走路时间walkTime(1 ≤ walkTime ≤ 1000)和taxiTime(1 ≤ taxiTime ≤ 1000),以空格分隔

  • 题目分析:
    咋一看以为很难,其实是简单题,直接枚举解决。1.要么坐车要么不坐车 2.坐车枚举坐车点就OK

  • 代码:

package WangYi2017Spring;

import java.util.Scanner;

public class HurryToBiz {
    public final static int MAX = 50+5;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n;
        int[] tx = new int[MAX];
        int[] ty = new int[MAX];
        int gx,gy,walkTime,taxiTime;


        while(sc.hasNext()){
            n = sc.nextInt();
            for(int i=0;ifor(int i=0;iint noTaxi = getDstn(0,0,gx,gy)*walkTime;   //不搭的士

            int taxi = Integer.MAX_VALUE;
            for(int i=0;iint temp = getDstn(0, 0, tx[i], ty[i])*walkTime + getDstn(tx[i], ty[i], gx, gy)*taxiTime;
                if(taxi>temp)
                    taxi = temp;
            }

            System.out.println(noTaxi>taxi?taxi:noTaxi);
        }
    }

    public static int getDstn(int x1,int y1,int x2,int y2){
        return Math.abs(x2-x1)+Math.abs(y2-y1);
    }

}

你可能感兴趣的:(工作前)