结构体优先队列的用法

今天做一个微软的校招笔试题 Registration Day ,用优先队列模拟操作的。粘贴来别人的代码,谨记 pq 的用法。另外 memset 包含在 string.h 里。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <limits.h>
 4 #include <queue>
 5 #include <vector>
 6 #include <set>
 7 #include <map>
 8 #include <algorithm>
 9
10 using namespace std;
11
12 int N, M, K;
13 struct Student
14 {
15     int id;
16     int arrive_time;
17     int office_num;
18     int finish_time;
19     std::vector<pair<int, int> > register_offices;
20 };
21 Student students[10005];
22 struct Event
23 {
24     int student_idx;
25     int office;
26     int begin;
27     int duration;
28     Event(int s, int o, int b, int d): student_idx(s), office(o), begin(b), duration(d){};
29 };
30 struct Cmp
31 {
32     bool operator()(const Event &e1, const Event &e2){
33         if (e1.begin == e2.begin)
34             return students[e1.student_idx].id > students[e2.student_idx].id;
35         return e1.begin > e2.begin;
36     }
37 };
38 priority_queue<Event, vector<Event>, Cmp> pq;
39 int pre[105];
40 int pos[10005];
41 void Solve() {
42     for (int i=0;i<N;++i) {
43         pq.push(Event(i, students[i].register_offices[0].first, students[i].arrive_time+K, students[i].register_offices[0].second));
44         pos[i] = 1;
45     }
46     memset(pre, -1, sizeof(pre));
47     while (!pq.empty()) {
48         Event e = pq.top();
49         pq.pop();
50         int st = e.student_idx;
51         if (pre[e.office] > e.begin) {
52             e.begin = pre[e.office];
53         }
54         int finish_time = e.begin + e.duration;
55         if (pos[st] == students[st].office_num) {
56             students[st].finish_time = finish_time;
57         } else {
58             int office = students[st].register_offices[pos[st]].first;
59             int duration = students[st].register_offices[pos[st]].second;
60             pq.push(Event(st, office, finish_time+K, duration));
61             pos[st]++;
62         }
63         pre[e.office] = finish_time;
64     }
65 }
66 int main()
67 {
68     scanf("%d%d%d", &N, &M, &K);
69     int p, o, w;
70     for (int i=0;i<N;++i) {
71         scanf("%d%d%d", &students[i].id, &students[i].arrive_time, &p);
72         students[i].office_num = p;
73         for (int j=0;j<p;++j) {
74             scanf("%d%d", &o, &w);
75             students[i].register_offices.push_back(make_pair(o, w));
76         }
77     }
78     Solve();
79     for (int i=0;i<N;++i) {
80         printf("%d\n", students[i].finish_time);
81     }
82     return 0;
83 }

以下是转载的 functional 模板的优先队列用法,以供方便做题查找

 1 #include<iostream>
 2 #include<functional>
 3 #include<queue>
 4 using namespace std;
 5 struct node
 6 {
 7     friend bool operator< (node n1, node n2)
 8     {
 9         return n1.priority < n2.priority;  //"<"为从大到小排列,">"为从小到大排列
10     }
11     int priority;
12     int value;
13 };
14 int main()
15 {
16     const int len = 5;  //也可以写在函数内
17     int i;
18     int a[len] = {3,5,9,6,2};
19     //示例1
20     priority_queue<int> qi;  //普通的优先级队列,按从大到小排序
21     for(i = 0; i < len; i++)
22         qi.push(a[i]);
23     for(i = 0; i < len; i++)
24     {
25         cout<<qi.top()<<" ";
26         qi.pop();
27     }
28     cout<<endl;
29     //示例2
30     priority_queue<int, vector<int>, greater<int> > qi2;  //从小到大的优先级队列,可将greater改为less,即为从大到小
31     for(i = 0; i < len; i++)
32         qi2.push(a[i]);
33     for(i = 0; i < len; i++)
34     {
35         cout<<qi2.top()<<" ";
36         qi2.pop();
37     }
38     cout<<endl;
39     //示例3
40     priority_queue<node> qn;  //必须要重载运算符
41     node b[len];
42     b[0].priority = 6; b[0].value = 1;
43     b[1].priority = 9; b[1].value = 5;
44     b[2].priority = 2; b[2].value = 3;
45     b[3].priority = 8; b[3].value = 2;
46     b[4].priority = 1; b[4].value = 4;
47
48     for(i = 0; i < len; i++)
49         qn.push(b[i]);
50     cout<<"优先级"<<‘\t‘<<"值"<<endl;
51     for(i = 0; i < len; i++)
52     {
53         cout<<qn.top().priority<<‘\t‘<<qn.top().value<<endl;
54         qn.pop();
55     }
56     return 0;
57 } 
时间: 2024-11-10 10:22:16

结构体优先队列的用法的相关文章

pair&lt;&gt;结构体模版的用法

1.pair算是一个结构体模版,定义的时候是这样的: pair<T1,T2> P; 其中T1,T2可以是int,string,double,甚至是vector<>. 2.进行初始化是这样的: pair<int,int> a(12,34); 也可以借用make_pair()函数: pair<int,int> a; a=make_pair(12,34); 3.进行调用是很简单的: pair<int,int> a(12,34); printf(&quo

数据结构之typedef在结构体中的用法

/*    2019年10月12日19:25:25    说明:typedef在结构体中的应用*/#include<stdio.h> typedef struct Student{    char name[9];    int age;}STU,*PSTU; //STU相当于struct Student,PSTU相当于struct Student * int main(void){    STU st; // 相当于struct Student st;    PSTU pst = &

hdu1873 看病要排队(结构体优先队列)

看病要排队 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5769    Accepted Submission(s): 2369 Problem Description 看病要排队这个是地球人都知道的常识. 只是经过细心的0068的观察,他发现了医院里排队还是有讲究的. 0068所去的医院有三个医生(汗,这么少)同一时候看病.而看病

nyoj754 黑心医生 结构体优先队列

<span style="font-family: Arial, Helvetica, sans-serif;">对队列不懂的 可以看看我转的这篇文章<a target=_blank href="http://blog.csdn.net/su20145104009/article/details/44562659" target="_blank">STL整理</a>.</span> <pre

hdu1873-看病要排队-(结构体优先队列)

http://acm.hdu.edu.cn/showproblem.php?pid=1873 #include<stdio.h> #include<iostream> #include<algorithm> #include<cstring> #include<math.h> #include<string> #include<map> #include<queue> #include<stack>

结构体中typedef语句用法总结

typedef为C语言的关键字,作用是为一种数据类型(这里仅讨论结构体数据类型)定义一个新名字.在编程中使用typedef目的一般有两个:给变量一个易记且意义明确的新名字:简化一些比较复杂的类型声明.1.typedef的最简单使用      typedef int Data;   //给已知数据类型int起个新名字---Data. 2.typedef 用法 & 结构体   typedef struct Node{           int info;           char flag;

C语言中结构体参数变量的传递

c语言  结构体  函数  参数  传递 一.前言 本文中的程序实现对员工信息结构体字段赋值并打印出来的功能.该结构体的定义如下: // 员工信息结构体 typedef struct {        INT8       szEmployeeName[100];     // 员工姓名        UINT16  iEmployeeAge;                    // 员工年龄        UINT32  iEmployeeNo;                      

认识C中的结构体

C中结构体是另外一种表示数据形式的方式,结构体中可以表示C中的基本数据形式,如int,double....结构体可以让我们更好的表示数据.下面来看看结构体. 说到结构体首先要了解的是它的申明形式,要申明一个结构体形式如下: 1 #include<stdio.h> 2 #define LEN 20 3 4 //申明一个结构体 5 struct name { 6 char firstname[LEN]; 7 char lastname[LEN]; 8 }; 9 10 //申明一个结构体 11 st

瘋子C语言笔记(结构体/共用体/枚举篇)

 (一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student { int num; char name[20]; char sex; int age; struct date birthday; /*birthday 是 struct date 类型*/ char addr[30]; }student1,student2; (1):结构体可嵌套 (2):与枚举相比结构体内元素为变量,而枚举为常