// 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;
}
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次在這上面!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.