【软件18-循环队列及综合】

  • 2019 年 10 月 10 日
  • 笔记

判断题

1-1

F:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。这种循环队列可以以单链表的方式来在实际编程应用中来实现。因此,循环队列是一个抽象的数据结构,而单向循环链表或循环数组是具体的实现方式,不是数据结构本身。<分析摘录自链接https://blog.csdn.net/Invokar/article/details/80010758>

单选题

2-2

这里注意人家的要求,用头指针和队列个数size代替一般队列的表示方法,这样就不用考虑尾指针了,最多可以直接填满。

2-3

这是一般的循环队列的表示,注意末尾要保留一个。

编程题

7-1

关于这道题目,模拟即可,需要定义两个结构体数组,一个是存窗口的,包括在此窗口排队的人数以及最后结束时间,另一个是存人的,包括其到达时间和处理时间。

#include<iostream>  #include<cstdio>  #include<algorithm>  using namespace std;  struct Person{      int T, P;  };  struct Window{      int num_person;      int endtime;  };  int N, T, P, K;  Person p[1000+10];  Window w[11];  int main()  {      // freopen("input.txt", "r", stdin);      // freopen("output.txt", "w", stdout);      scanf("%d", &N);      for(int i = 0; i < N; i++)      {          scanf("%d %d", &T, &P);          if(P > 60)              P = 60;          p[i].T = T;          p[i].P = P;      }      scanf("%d", &K);      for(int i = 0; i < K; i++)      {          w[i].num_person = 0;          w[i].endtime = 0;      }        int sum_time = 0, max_time = 0, end_time = 0;      for(int i = 0; i < N; i++)      {          int minwindow = 1e9, idx = -1;          bool Wait = true;          for(int j = 0; j < K; j++)          {              if(p[i].T >= w[j].endtime)              {                  w[j].num_person++;                  Wait = false;                  w[j].endtime = p[i].T + p[i].P;                  break;              }              else        //寻找等待时间最小的窗口              {                  if(minwindow > w[j].endtime)                  {                      minwindow = w[j].endtime;                      idx = j;                  }              }          }          if(Wait)          {              sum_time += minwindow - p[i].T;              max_time = max(max_time, minwindow - p[i].T);              w[idx].endtime += p[i].P;              w[idx].num_person++;          }      }      for(int i = 0; i < K; i++)      {          if(w[i].endtime > end_time)              end_time = w[i].endtime;      }      printf("%.1lf %d %dn", (double)sum_time / (double)N, max_time, end_time);      for(int i = 0; i < K; i++)      {          if(i != 0) printf(" ");          printf("%d",w[i].num_person);      }  }

7-2

该题目目前不会,

#include<iostream>  #include<cstdio>  #include<algorithm>  #include<set>  using namespace std;  int N, num;  set<int> p;  int main()  {      // freopen("input.txt", "r", stdin);      // freopen("output.txt", "w", stdout);      scanf("%d", &N);      scanf("%d", &num);      p.insert(num);      --N;      while(N--)      {          scanf("%d", &num);          if(p.upper_bound(num) != p.end())              p.erase(p.upper_bound(num));          p.insert(num);      }      cout << p.size() << endl;  }