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;
}                                 



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