zoukankan      html  css  js  c++  java
  • zju-pat 1014

    //本题需要有较好的抽象能力,把题目的问题,转化了相应的数学模型,这样就容易办了
    #include <iostream>
    #include <string.h>
    #include <math.h>
    #include <queue>
    #include <vector>
    using namespace std;
    #define INF 0xeffffff
    typedef struct Customer
    {
        int leave;
        int process;
    };
    
    int main()
    {
        int n,m,k,q;
        int i,j;
        while(cin>>n>>m>>k>>q)
        {
            vector <Customer>cus(k); //初始化k个顾客  
            vector<int>query(q,0);
            for(i =0;i<k;i++)
            {
                scanf("%d",&cus[i].process);
                cus[i].leave = INF;
            }
            for(j =0;j<q;j++)
                scanf("%d",&query[j]);
    
            vector<queue<int>> wind(n);  //队列的向量,来表示多个窗口,窗口本身可以用队列模拟
            vector<int>time_base(n,0);
            for(i =0;i < n*m && i<k;i++)  //根据容量,首先分配给每个窗口的用户,并且在排队的用户的时间是定下来的
            {
                cus[i].leave = time_base[i%n] + cus[i].process; //记录每个客人离开时间
                time_base[i%n] = cus[i].leave; //记录下个时间点
                wind[i%n].push(i);  //记录下每个窗口的客户编号
            }
            for(;i<k;i++)  //剩余
            {
                int min_wind = 0;
                int temp_min_time = INF;
                for(j =0;j<n;j++) //遍历每个窗口,查找最早离开的顾客,作为下一个顾客的入队
                {
                    int top = wind[j].front(); //对头顾客编号
                    if(temp_min_time > cus[top].leave)
                    {
                        temp_min_time = cus[top].leave;
                        min_wind = j;
                    }
                }
                wind[min_wind].pop(); //出队
                cus[i].leave = time_base[min_wind] + cus[i].process; //计算该顾客的离开时间
                time_base[min_wind] = cus[i].leave;
                wind[min_wind].push(i); //选择在最快的窗口入队
            }
            for(j = 0;j < q; j++)
            {
                int no = query[j] -1;
                if(cus[no].leave - cus[no].process >= 540)
                    printf("Sorry
    ");
                else
                    printf("%02d:%02d
    ",cus[no].leave/60 + 8,cus[no].leave%60);
            }
        }
        return 0;
    }
  • 相关阅读:
    python socket练习
    python异常处理
    python类的反射
    类的特殊成员方法
    staticmethod classmethod property方法
    类的多态
    类的析构、继承
    python subprocess模块
    python面向对象
    discuz 使模板中的函数不解析 正常使用
  • 原文地址:https://www.cnblogs.com/cheng07045406/p/3519750.html
Copyright © 2011-2022 走看看