今日头条笔试题--2018(3) 【 优先队列 】

时间限制:1秒

空间限制:81920K

产品经理(PM)有很多好的idea,而这些idea需要程序员实现。现在有N个PM,在某个时间会想出一个 idea,每个 idea 有提出时间、所需时间和优先等级。对于一个PM来说,最想实现的idea首先考虑优先等级高的,相同的情况下优先所需时间最小的,还相同的情况下选择最早想出的,没有 PM 会在同一时刻提出两个 idea。

同时有M个程序员,每个程序员空闲的时候就会查看每个PM尚未执行并且最想完成的一个idea,然后从中挑选出所需时间最小的一个idea独立实现,如果所需时间相同则选择PM序号最小的。直到完成了idea才会重复上述操作。如果有多个同时处于空闲状态的程序员,那么他们会依次进行查看idea的操作。

求每个idea实现的时间。

输入第一行三个数N、M、P,分别表示有N个PM,M个程序员,P个idea。随后有P行,每行有4个数字,分别是PM序号、提出时间、优先等级和所需时间。输出P行,分别表示每个idea实现的时间点。

输入描述:
输入第一行三个数N、M、P,分别表示有N个PM,M个程序员,P个idea。随后有P行,每行有4个数字,分别是PM序号、提出时间、优先等级和所需时间。全部数据范围 [1, 3000]。
输出描述:
输出P行,分别表示每个idea实现的时间点。
输入例子1:
2 2 5
1 1 1 2
1 2 1 1
1 3 2 2
2 1 1 2
2 3 5 5
输出例子1:
3
4
5
3
9

想法:    1  采用时间顺序来模拟 对于每一个时间点  如果某个pm产生idea则进入该pm的优先队列    2  对于所有pm的优先事件建立一个优先队列2    3  判断每个程序员是否忙碌,空闲时开始处理idea(队列2弹出顶部,同样该idea的pm优先队列也弹出,并将之后的优先事件重新弹入队列2)错误点:    无法计算_end终止时间。注意循环跳出的时间
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=3007;
 4 struct node {
 5     int num;
 6     int id;
 7     int s,l,p;
 8 };
 9 struct cmp1 {
10     bool operator() (const node& a,const node& b) {
11         if (a.p==b.p&&a.l==b.l)
12             return a.s>b.s;
13         else if (a.p==b.p)
14             return a.l>b.l;
15         else return a.p<b.p;
16     }
17 };
18 struct cmp2 {
19     bool operator() (const node& a,const node& b) {
20         if (a.l==b.l)
21             return a.id>b.id;
22         return a.l>b.l;
23     }
24 };
25 bool cmp (node a,node b) {
26     return a.s<b.s;
27 }
28 priority_queue <node, vector <node>,cmp1> q[N];
29 priority_queue <node, vector <node>,cmp2> qs;
30 bool isok[N];  int e_t[N];
31 node idea[N];  int ans[N];
32 int _s;
33 int n,m,k;
34 int main ()
35 {
36     _s=0x3f3f3f3f;
37     scanf ("%d %d %d",&n,&m,&k);
38     for (int i=1;i<=k;i++)  {
39         idea[i].num=i;
40         scanf ("%d %d %d %d",&idea[i].id,&idea[i].s,&idea[i].p,&idea[i].l);
41         _s=min (_s,idea[i].s);
42     }
43     sort (idea+1,idea+1+k,cmp);
44     for (int i=1;i<=m;i++) isok[i]=1;
45     int j=1;
46     for (int i=_s; ;i++) {
47         while (j<=k&&idea[j].s<=i) {
48             q[idea[j].id].push(idea[j]);
49             j++;
50         }
51         while (!qs.empty()) qs.pop();
52         for (int t=1;t<=n;t++) {
53             if (!q[t].empty())
54                 qs.push(q[t].top());
55         }
56         for (int t=1;t<=m&&!qs.empty();t++) {
57             if (!isok[t]&&e_t[t]<=i) isok[t]=1;
58             // if (!isok[t]&&e_t[t]==i) isok[t]=1;  错误点1
59             if (isok[t]) {
60                 // 核心代码
61                 node tmp=qs.top(); qs.pop();
62                 isok[t]=0;  e_t[t]=i+tmp.l;
63                 ans[tmp.num]=e_t[t];
64                 q[tmp.id].pop();
65                 if (!q[tmp.id].empty())
66                     qs.push(q[tmp.id].top());
67             }
68         }
69         if (j>k&&qs.empty()) break;  // 错误点2 注意终止条件
70     }
71     for (int i=1;i<=k;i++)
72         printf("%d\n",ans[i]);
73     return 0;
74 }

原文地址:https://www.cnblogs.com/xidian-mao/p/9601903.html

时间: 2024-10-12 02:26:07

今日头条笔试题--2018(3) 【 优先队列 】的相关文章

2018春招-今日头条笔试题-第三题(python)

题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 本题的做法最重要的应该是如何拼出'1234567890',对于输入表达试获得对应的结果利用python内置函数eval()即可以实现.利用5个字符串来表达'1234567890',如下(为了好看,里面加了tab空格符) '66666 ....6 66666 66666 6...6 66666 66666 66666 66666 66666''6...6 ....6 ....6 ....6 6...6 6.... 6

头条笔试题2018后端第二批

头条笔试题2018后端第二批 标签(空格分隔): 笔试题 描述:为了不断优化推荐效果,今日头条每天要存储和处理海量数据.假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,我们会想知道某一段时间内注册的用户(标号相连的一批用户)中,有多少用户对这类文章喜好值为k.因为一些特殊的原因,不会出现一个查询的用户区间完全覆盖另一个查询的用户区间(不存在L1<=L2<=R2<=R1). 输入描述: 输入: 第1行为n代表用户的个数 第2行为n个整数,

今日头条笔试题 1~n的每个数,按字典序排完序后,第m个数是什么?

# 由于n和m都是10^18的范围,暴力明显不行,只能dfs了.# 先预处理n的十进制,存到num数组中,长度计算出来为len, 答案存到Num中.# 写个函数cntOfBeginNum(int *Num,int anslen),计算以num为前缀的小于等于n的数的个数cnt,考虑长度比n的十进制长度小的数,则cnt+=1+10+100+1000......# 长度和n相等的则要特判一下,前缀Num和num的前缀有3种关系,> = < ,先判断是哪种,再计算.# 然后考虑答案的最高位非0,我们

数组元素前移问题(今日头条笔试题)

问题描述:给定一个整数数组和一个整数x,将数组中元素值为x的元素都放到数组的前面,其他元素的相对顺次不变. 例如:原数组为{4,0,1,0,2,,3,6,0,5},x=0,则调整后的数组为{0,0,0,4,1,2,3,6,5} 分析:该问题存在多种解法. 解法一:辅助数组法.创建一个和原数组一样长度的数组,从原数组的尾部开始扫描,如果元素值是x,则忽略. 否则,将元素拷贝到新数组的末尾.扫描完原数组后,再在新数组未重新赋值的元素全部赋值为x. 最后再将新数组的所有元素赋值到原数组中. 假设原数组

Trie树/字典树题目(2017今日头条笔试题:异或)

1 /* 2 本程序说明: 3 4 [编程题] 异或 5 时间限制:1秒 6 空间限制:32768K 7 给定整数m以及n各数字A1,A2,..An,将数列A中所有元素两两异或,共能得到n(n-1)/2个结果,请求出这些结果中大于m的有多少个. 8 输入描述: 9 第一行包含两个整数n,m. 10 11 第二行给出n个整数A1,A2,...,An. 12 13 数据范围 14 15 对于30%的数据,1 <= n, m <= 1000 16 17 对于100%的数据,1 <= n, m,

给定二维平面整数点集输出“最大点集”算法(今日头条面试题)

引子 最近自己的独立游戏上线了,算是了却了一桩心愿.接下来还是想找一份工作继续干,创业的事有缘再说. 找工作之前,总是要浏览一些实战题目,热热身嘛.通过搜索引擎,搜到了今日头条的一道面试题. 题目 P为给定的二维平面整数点集.定义 P 中某点x,如果x满足 P 中任意点都不在 x 的右上方区域内(横纵坐标都大于x),则称其为"最大的".求出所有"最大的"点的集合.(所有点的横坐标和纵坐标都不重复, 坐标轴范围在[0, 1e9) 内) 如下图:实心点为满足条件的点的集

web前端整套面试题(二)--今日头条面试题

12道单选,7道不定项选择,2道编程题 一.单选(12题) 1.[单选题]在HTML中,( )可以在网页上通过链接直接打开邮件客户端发送邮件. A.<a href=”telnet:[email protected]”>发送邮件</a> B.<a href=”mail:[email protected]”>发送邮件</a> C.<a href=”mailto:[email protected]”>发送邮件</a> D.<a hre

2018头条笔试题-世界杯问题

题目: 输入如下面所示: 前一行是m行.n列 后面是这个m行n列的数据,从任意一个1出发,可上下.左右.斜角遍历 要求输出有多少个连通图.连通图中包含的最大连通个数. 10,10 0,0,0,0,0,0,0,0,0,0 0,0,0,1,1,0,1,0,0,0 0,1,0,0,0,0,0,1,0,1 1,0,0,0,0,0,0,0,1,1 0,0,0,1,1,1,0,0,0,1 0,0,0,0,0,0,1,0,1,1 0,1,1,0,0,0,0,0,0,0 0,0,0,1,0,1,0,0,0,0

2017-今日头条笔试题

1 package com.shb.java; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.List; 6 7 /** 8 * 实现将字符串中重复次数打印出来(就是这个意思,原话描述不清了) 9 * @author shaobn 10 * @date 2016-9-28 11 * @package_name com.shb.java 12 */ 13 public class Demo