2018今日头条大数据方向笔试题

题目链接

一、一道繁琐的大模拟

N个产品经理,M个程序员,P个需求。N个产品经理向M个程序员提出P个需求。
每个需求用四元组表示:产品经理ID(谁提出的) 提出时间 优先级(数字越大优先级越高) 需求开发时长
每个产品经理对于自己的需求按照:优先级从高到低、开发时长从短到厂、提出时间 从早到晚排序
每个程序员每次从产品经理最想做的需求里面挑选用时最短(如果时间相同优先做PM编号较小的需求)

求每个需求的完成时间。

import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;

public class Main {
class Idea {
    int pm, think, use, pri, index;
    int over;

    Idea(int pm, int think, int pri, int use, int index) {
        this.pm = pm;
        this.think = think;
        this.use = use;
        this.pri = pri;
        this.index = index;
    }

    @Override
    public String toString() {
        return "pm:" + pm + " think:" + think + " use" + use + " pri:" + pri;
    }
}

class Pm {
    PriorityQueue<Idea> ideas = new PriorityQueue<>((x, y) -> {
        if (x.pri != y.pri) return -x.pri + y.pri;
        if (x.use != y.use) return x.use - y.use;
        return x.think - y.think;
    });

    boolean want(Idea i) {
        return ideas.peek() == i;
    }
}

class Programmer {
    int time = 0;
}

Main() {
    Scanner cin = new Scanner(System.in);
    int PMCount = cin.nextInt(), ProgrammerCouunt = cin.nextInt(), IdeaCount = cin.nextInt();
    Idea[] a = new Idea[IdeaCount];
    Pm pms[] = new Pm[PMCount + 1];
    for (int i = 0; i <= PMCount; i++) {
        pms[i] = new Pm();
    }
    for (int i = 0; i < IdeaCount; i++) {
        a[i] = new Idea(cin.nextInt(), cin.nextInt(), cin.nextInt(), cin.nextInt(), i);
    }
    PriorityQueue<Programmer> consumer = new PriorityQueue<>(Comparator.comparing(x -> x.time));
    Arrays.sort(a, Comparator.comparingInt(x -> x.think));
    int ai = 0;
    PriorityQueue<Idea> producer = new PriorityQueue<>((x, y) -> {
        if (x.use != y.use) return x.use - y.use;
        return x.pm - y.pm;
    });
    for (int i = 0; i < ProgrammerCouunt; i++) consumer.add(new Programmer());
    while (!producer.isEmpty() || ai < a.length) {
        Programmer worker = consumer.poll();
        if (producer.isEmpty()) {
            worker.time = Math.max(a[ai].think, worker.time);
        }
        while (ai < a.length && a[ai].think <= worker.time) {
            Idea task = a[ai++];
            pms[task.pm].ideas.add(task);
            producer.add(task);
        }
        Idea idea = producer.poll();
        Pm pm = pms[idea.pm];
        if (pm.want(idea)) {//如果当前idea是pm最想做的idea
            pm.ideas.poll();//pm完成了这个任务
            if (!pm.ideas.isEmpty()) producer.add(pm.ideas.peek());
            worker.time = idea.over = Math.max(worker.time, idea.think) + idea.use;
//            System.out.println("idea " + idea + " " + worker.time);
        }
        consumer.add(worker);
    }
    Arrays.sort(a, Comparator.comparingInt(x -> x.index));
    for (Idea i : a) {
        System.out.println(i.over);
    }
}

public static void main(String[] args) {
    new Main();
}
}

二、单调栈的变形应用

给定数组a[N],它有许多区间,求s=min(a[l:r]) \times sum(a[l:r])的最大值。a[N]中全为正整数。

sum(a[l:r])可以快速通过前缀和求出,因为要求s的最大值,所以区间[l:r]应该尽量大。但是又不能太大,因为太大的话,会使得min(a[l:r])很小。
对于a中的每个元素a[i],在保证a[i]为最小值得情况下,扩张左区间和右区间。问题转化为快速求解a[i]左右第一个比它小的元素。

#include<iostream>
#include<stdio.h>
#include<map>
#include<algorithm>
#include<stack>
using namespace std;
const int maxn = 5 * 1e5;
int n;
int a[maxn];
int s[maxn];
int lef[maxn], righ[maxn];//每个数字左边比我小的和右边比我小的
int getsum(int f, int t) {
    if (t == 0)return s[f];
    return s[t] - s[f - 1];
}
int main() {
    cin >> n;
    for (int i = 0; i < n; i++)scanf("%d", a + i);
    int nows = 0;
    for (int i = 0; i < n; i++) {
        s[i] = nows + a[i];
        nows += a[i];
    }
    stack<int>sta;
    for (int i = 0; i < n; i++) {
        while (!sta.empty()) {
            int topIndex = sta.top();
            int value = a[topIndex];
            if (value > a[i]) {
                sta.pop();
                righ[topIndex] = i - 1;
            }
            else {
                break;
            }
        }
 
        int last = (sta.empty() ? 0 : sta.top() + 1);
        lef[i] = last;
        sta.push(i);
    }
    while (!sta.empty()) {
        int topIndex = sta.top();
        sta.pop();
        righ[topIndex] = n - 1;
    }
    long long  s = 0;
    for (int i = 0; i < n; i++) {
        s = max(s, getsum(lef[i], righ[i])*(long long)a[i]);
    }
    cout << s << endl;
    return 0;
}

三、求边界点

平面直角坐标系第一象限中包含一堆整数点,请找到全部满足以下条件的点:(x,y)的左方、上方一个点也没有。
这道题简单的排序就能通过,但是因为数据量太大,用Java很容易超时,用C++ cin都会超时,必须用scanf才可以。

#include<iostream>
#include<stdio.h>
#include<map>
#include<algorithm>
using namespace std;
const int maxn = 5 * 1e5;
int n;
struct Point {
    int x, y;
}a[maxn];
int b[maxn];
int bi;
bool com(const Point&one, const Point&two) {
    if (one.x != two.x)return one.x<two.x;
    else return one.y < two.y;
}
int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
        scanf("%d%d", &a[i].x, &a[i].y);
    }
    sort(a, a + n, com);
    bi = 0;
    for (int i = 0; i < n; i++) {
        if (i == n || a[i].x != a[i + 1].x) {
            b[bi++] = i;
        }
    }
    int ma = 0;
    for (int i = bi - 1; i >= 0; i--) {
        int ind = b[i];
        if (ma > a[ind].y) {
            b[i] = -1;
        }
        ma = max(ma, a[ind].y);
    }
    for (int i = 0; i < bi; i++) {
        if (b[i] != -1) {
            int ind = b[i];
            cout << a[ind].x << " " << a[ind].y << endl;
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/weiyinfu/p/9508456.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大数据面试笔试资料-56家互联网大公司面试笔试题资料整理汇总: hive面试.doc 京东.jpg 笔试题1.docx 笔试题10.jpg 笔试题11.JPG 笔试题12_搜狐 笔试题13_九章云极科技有限公司 笔试题14_北京东方国信科技股份有限公司-联通事业部-笔试题 笔试题15_百分点 笔试题16_Admaster 笔试题2.docx 笔试题3.docx 笔试题4_boss直聘.docx 笔试题5_面试题4的实现思路.docx 笔试题6.jpg 面试总结 面试题1.doc 面试题2.doc 面试题3.doc 面试题7+面试题8+面试题9_北京广视通达数字网络科技有限公司 中企动力面试总结?-面试题1 畅捷通(用友集团)?-面试题2 麦达数字面试?-面试题3 boss直聘面试?-面试题5 博易智软(北京)技术股份有限公司?面试题7 公安部第一研究所?面试题7 IBM?面试题7 车网互联?面试题7 凯立德科技股份有限公司?面试题7 北京捷通华声语音技术有限公司?面试题7 北京法意科技有限公司?面试题7 大树科技(重点)?面试题7 北京XXX宇有限公司??面试题8 盛世全景?面试题8 华胜天成?面试题8 联龙博通?面试题8 大麦网?面试9 京东金融?面试10 滴滴打车 架构师?面试11 神州?面试11 百分点科技?面试11 锐安科技?面试12---有笔试 人人贷?国舜科技?面试13 宜信?面试16 明略数据?面试17 爱奇艺面试面试18---爱奇艺明确有背景调查,记在面试评测上面,由hr写背景调查评测----(直接卡死了) 奥维云网?面试26 喜马拉雅FM?中星电子?银橙传媒?面试27 电信云计算?面试题29 乐视?面试题29 优酷?面试题29 无双科技公司?面试题30 亿玛在线公司?面试题30 58同城?面试题30 talkingDate?面试题30 慕华信息科技有限公司?面试题30 美团网?面试题31 LeanCloud?面试题31 筑巢新游?面试题31 阿里巴巴?面试题32 博睿宏远?面试题33 融易通?面试题33 中国互联网络信息中心?面试题33? 优酷土豆?面试题33 乐视?面试题41 TalkingData?面试题41 网德天下?面试题41 东方国信?面试题41 畅捷通?面试题41 太极?面试题41 北京四中网校?面试题41 SenseTime?面试题41 易观智库?面试题41 银创科技?面试题41 京东?面试题41 壕鑫互连?面试题41 滴答拼车?面试题41
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值