2021中兴捧月神算师算法赛,4-24第一场,第三题: C - 做任务,2021-4-27

第三题: 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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值