zoukankan      html  css  js  c++  java
  • NowCoder小杰的签到题(模拟,思维)

    链接:

    https://www.nowcoder.com/acm/contest/52/M

    题意:

    给定n个队伍的到场时间, 有3个报道位, 每个队伍报道需要b时间, 求所有报道完成的时间。

    分析:

    一开始写了一个模拟时间轴的, 虽然过了,但是在时间很大的时候行不通。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     int a[3], u[3];
     6     int n, b, time, ok, T;
     7     scanf("%d", &T);
     8     while(T--){
     9         time = 0, ok = 0;
    10         a[0] = a[1] = a[2] = 0;
    11         u[0] = u[1] = u[2] = 0;
    12         priority_queue<int, vector<int>, greater<int> > q;
    13         scanf("%d", &n);
    14         for(int i = 0; i < n; i++){
    15             int t; scanf("%d", &t);
    16             q.push(t);
    17         }
    18         scanf("%d", &b);
    19         a[0] = q.top() + b; q.pop();
    20         u[0] = 1;
    21         while(1){
    22  
    23             for(int i = 0; i < 3; i++){
    24                 if(u[i] && time >= a[i]) u[i] = 0;
    25                 if(!q.empty() && time >= q.top() && !u[i]){
    26                     u[i] = 1;
    27                     a[i] = time + b;
    28                     q.pop();
    29                 }
    30             }
    31 //            printf("%d %d %d %d
    ", time, a[0], a[1], a[2]);
    32             if(u[0] == 0 && u[1] == 0 && u[2] == 0 && q.empty()) break;
    33             time++;
    34         }
    35         printf("%d
    ", time);
    36     }
    37     return 0;
    38 }
    模拟时间轴

    后来看了一下人家的代码, 发现可以用优先队列模拟报道。

    就是一开始对报道时间排序,将3个报道位置加入优先队列, 然后每次都取最早完成报道的时间, 如果这个时间t小于队伍时间, 那么就将a[i] + b入队, 否则将t+b入队。

    最后就能求出全部完成报道的时间了

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5 //    freopen("debug.txt","r", stdin);
     6     int a[1234];
     7     int n, b, T;
     8     scanf("%d", &T);
     9     while(T--){
    10         scanf("%d", &n);
    11         for(int i = 0; i < n; i++){
    12             scanf("%d", &a[i]);
    13         }
    14         scanf("%d", &b);
    15         sort(a, a + n);
    16         if( n <= 3 ){
    17             printf("%d
    ", a[n-1] + b);
    18             continue;
    19         }
    20         priority_queue<int, vector<int>, greater<int> > q;
    21         for(int i = 0; i < 3; i++) q.push(a[i] + b);
    22         for(int i = 3; i < n; i++){
    23             int x = q.top();q.pop();
    24             if(a[i] < x){
    25                 q.push(x + b);
    26             }
    27             else q.push(a[i] + b);
    28         }
    29         while(!q.empty()){
    30             q.pop();
    31             if(q.size() == 1) printf("%d
    ", q.top());
    32         }
    33     }
    34     return 0;
    35 }
  • 相关阅读:
    linux(cat,more,less,head)——对文件显示进行查看操作
    linux(ln)
    Linux(touch)
    Linux(cp)
    Linux(rmdir,rm,mv)
    Linux(mkdir)
    一个对象是否能够引用该类其他实例的私有成员?
    圆角图标
    android.content.ReceiverCallNotAllowedException问题解决
    list view item高度设置
  • 原文地址:https://www.cnblogs.com/Jadon97/p/8048614.html
Copyright © 2011-2022 走看看