• PAT 1014. Waiting in Line


    只能说看清题意很重要,md扯了半天是开始时间在17:00之前的可以而不是结束时间。另外代码里选取最小队列的过程(move_customers内)可以用priority_queue来加速,不过反正约定的数据量不大就直接遍历吧。

    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <climits>
    #include <vector>
    #include <list>
    #include <queue>
    
    using namespace std;
    
    class Man {
    public:
        int need;
        int time;
        int finish;
        Man(int t = 0) : time(t), finish(0), need(t) {}
    
    };
    
    int move_customers(list<int>& wait, vector<list<int> >& win, int win_max) {
        if (wait.size() == 0 || win_max <= 0 || win.size() <=0) {
            return 0;
        }
        int win_num = win.size();
        int moved = 0;
        int min_index = 0;
        for (int i=0; i<win_num; i++) {
            if (win[i].size() < win[min_index].size()) {
                min_index = i;
            }
        }
        if (win[min_index].size() == win_max) {
            // all windows are full
            return 0;
        }
        int customer = wait.front();
        wait.pop_front();
        win[min_index].push_back(customer);
        moved++;
        return moved;
    }
    
    int time_step(vector<Man>& customers, vector<list<int> >& win, int time_elasped) {
        int win_num = win.size();
        int min_time_step = INT_MAX;
        bool has_wait = false;
        // get the mininum time step
        for (int i=0; i<win_num; i++) {
            if (win[i].size() == 0) {
                continue;
            }
            has_wait = true;
            int cur = customers[win[i].front()].time;
            if (cur < min_time_step) {
                min_time_step = cur;
            }
        }
        
        time_elasped += has_wait ? min_time_step : 0;
        // time walk
        for (int i=0; i<win_num; i++) {
            list<int>& cur = win[i];
            if (cur.size() == 0) {
                // win empty
                continue;
            }
            Man& man = customers[cur.front()];
            man.time  -= min_time_step;
            if (man.time == 0) {
                // this customer has been done
                man.finish = time_elasped;
                cur.pop_front();
            }
        }
        
        return time_elasped;
    }
    
    
    void print(int finish, int need) {
        int start = finish - need;
        int maxtime = (17 - 8) * 60;
        if (start >= maxtime) {
            printf("Sorry
    ");
            return;
        }
        int hour = 8 + finish / 60;
        int min  = finish % 60;
        printf("%02d:%02d
    ", hour, min);
    }
    
    int main() {
    
        int N, M, K, Q;
        scanf("%d%d%d%d", &N, &M, &K, &Q);
        
        vector<list<int> > win(N);
        
        list<int> wait_queue;
        vector<Man> customers;
        
        for (int i=0; i<K; i++) {
            int time;
            scanf("%d", &time);
            customers.push_back(Man(time));
            
            wait_queue.push_back(i);
        }
    
        int time_elasped = 0;
        int last_time = -1;
        while (last_time != time_elasped) {
            while (move_customers(wait_queue, win, M) != 0);
            last_time = time_elasped;
            time_elasped = time_step(customers, win, last_time);
        }
    
        for (int i=0; i<Q; i++) {
            int qi;
            scanf("%d", &qi);
            Man& man = customers[--qi];
            print(man.finish, man.need);
        }
        
    
        system("pause");
        return 0;
    }
  • 相关阅读:
    Oracle 验证A表的2个字段组合不在B表2个字段组合里的数据
    jQuery方法一览
    Maven构建项目时index.jsp文件报错
    DDL——对数据库表的结构进行操作的练习
    不经意的小错误——onclick和click的区别
    UML基础——统一建模语言简介
    基于UML的面向对象分析与设计
    数据结构之——树与二叉树
    UML类图几种关系的总结
    C3P0连接参数解释
  • 原文地址:https://www.cnblogs.com/lailailai/p/4323611.html
Copyright © 2020-2023  润新知