第三题: C - 做任务
题目描述
假设我们有一些任务列表,任务编号从1开始。不同的任务难度也不一样,分为1-5级。
我们打算把这些任务分配给牛牛,可是牛牛比较懒,每次他接受到一个任务后,他都会从自己的todo list里找到“难度各不相同且编号和最大的五个任务”,然后再一起完成,否则的话,牛牛就把任务放到自己的todo list,什么也不做。
请你根据输入的任务列表的情况,给出牛牛完成任务的情况。
分析:
1.只有当5个难度的任务都有的时候才会输出,且会挑编号和最大的数,由于我们是从序号0开始读取任务,因此即取最新读取进来的5个不同难度的任务就可以,这是一个先进后出,那么就会想到用堆栈来解决。使用5个堆栈分别表示5个当前存储的不同难度的任务,当每个栈都不为空时,就按顺序分别输出每个栈顶的值并弹出。
2.该问题是一个流水线问题,不能将所有任务全部压入栈之后再输出!因此需要读取一个任务就进行判断一次。我的想法是,每读取一个任务,就进行一次判断,如果满足要求,就5个栈顶分别输出,保存结果,否则不满足就保存-1到结果中。等到所有任务数据都读完后,统一输出结果。
//第三题: C - 做任务
#include <queue>
#include <vector>
#include <stack>
#include <cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
int i;
int sum;
int outflag=0;
cin>>n;
vector<int> arr(n+1,0);
vector<vector<int>> ans;
stack<int> Q1;
stack<int> Q2;
stack<int> Q3;
stack<int> Q4;
stack<int> Q5;
for(i=1;i<=n;i++)
{
cin>>arr[i];
switch(arr[i])
{
case 1:{Q1.push(i); break;}
case 2:{Q2.push(i); break;}
case 3:{Q3.push(i); break;}
case 4:{Q4.push(i); break;}
case 5:{Q5.push(i); break;}
}
vector<int> tmp;
if(!Q1.empty()&&!Q2.empty()&&!Q3.empty()&&!Q4.empty()&&!Q5.empty())
{
tmp.push_back(Q1.top());
tmp.push_back(Q2.top());
tmp.push_back(Q3.top());
tmp.push_back(Q4.top());
tmp.push_back(Q5.top());
Q1.pop();
Q2.pop();
Q3.pop();
Q4.pop();
Q5.pop();
}
else
tmp.push_back(-1);
ans.push_back(tmp);
}
for(int i=0;i<n;i++){
if(ans[i].size()==1)
cout<<ans[i][0]<<endl;
else{
cout<<ans[i][0]<<" ";
cout<<ans[i][1]<<" ";
cout<<ans[i][2]<<" ";
cout<<ans[i][3]<<" ";
cout<<ans[i][4]<<endl;
}
}
return 0;
}