sicily 1082.MANAGER

题意:对于若干个进程(process)和一个进程队列有以下几种操作
a x 将花费为x的进程添加到进程队列中
p i 修改当前模式为i
r 根据p的不同删除队列中最大或最小的进程并输出,p为1时删除并输出最小的,p为2时删除并输出最大的,注意只有当前remove次数是在remove list里面的时候才需要输出,否则只删除
e 结束当前的case

p的默认值是1
r操作,当前remove次数在remove list时才需要输出,当队列为空,输出-1。

样例输入:
5 // 进程队列允许的最大cost值
2 // remove list 里面有两个元素
1 3 // 分别是1和3,就是说第1次r操作和第3次r操作要输出,其余的r操作不用
a 2 // 将进程cost为2的进程加入到队列
a 3 // 将进程cost为3的进程加入到队列
r // 进行一次r操作,由于是第1次,‘1’在remove list里面,要删除并输出,p默认是1,输 // 出并删除队列最小值2
a 4 // 将进程cost为4的进程加入到队列
p 2 // 更改模式为2
r // 当前模式为2,由于是第2次操作,‘2’不在remove list里面,只需要删除最大值4
a 5 // 将进程cost为5的进程加入到队列
r // 当前模式为2,且是第3次r操作,‘3’在remove list里面,删除并输出最大值5
e // 结束
样例输出
2
5

解题思路:用vector模拟堆咯.注意样例之间的空行啊!!最后一个不能输出空行!WA了N次在这上面!!
// Problem#: 1082
// Submission#: 2619328
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <iostream>
#include <vector>
#include <string>
using namespace std;

vector<int> relist;
int p;

int getmin(vector<int> q)
{
    int min = q[0];
    int index = 0;
    for(int i = 1;i < q.size();i++)
        if(q[i] < min)
        {
            min = q[i];
            index = i;
        }

    return index;
}

int getmax(vector<int> q)
{
    int max = q[0];
    int index = 0;
    for(int i = 1;i < q.size();i++)
        if(q[i] > max)
        {
            max = q[i];
            index = i;
        }

    return index;
}

int main()
{
    int Maxcost,rl,x;
	bool flag = false;
    while(cin >> Maxcost && Maxcost != 0)
    {
		if(flag)
			cout << endl;
		flag = true;
        cin >> rl;
        relist.clear();
        for(int i = 0;i < rl;i++)
        {
            //int x;
            cin >> x;
            relist.push_back(x);
        }
        
        string s1;
        int temp;
        int count = 0;//记录移除的次数
        vector<int> que;//模拟队列
        p = 1;//默认初始值
        while(cin >> s1 && s1 != "e")
        {
            if(s1 != "r")
            {
                if(s1 == "a")//添加
                {
                    cin >> temp;
                    que.push_back(temp);
                }
                else if(s1 == "p")//改变策略
                {
                    cin >> temp;
                    p = temp;
                }
            
            }
            else//移除
            {
                if(que.empty())
                {
                    cout << -1 << endl;
                    break;
                }
                if(p == 1)//移除最小的(vector头结点)
                {
                
                    count++;
                    int index = getmin(que);
                    int t = que[index];
                    que.erase(que.begin() + index);
                
                    for(int i = 0;i < rl;i++)
                    {
                        if(count == relist[i])
                        {
                            cout << t << endl;
                            break;
                        }
                    }
                        
                }
                else//移除最大的(尾结点)
                {
                    count++;
                    int index = getmax(que);
                    int t = que[index];
                    que.erase(que.begin() + index);
                
                    for(int i = 0;i < rl;i++)
                    {
                        if(count == relist[i])
                        {
                            cout << t << endl;
                            break;
                        }
                    }
                }
            }
        }
    }

    return 0;
}                                 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章