问题描述
链接:https://www.nowcoder.com/questionTerminal/6235a76b1e404f748f7c820583125c50?f=discussion
来源:牛客网
有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的。
给定一个操作序列int[][2] ope(C++中为vector<vector<int>>)代表所有事件。若第一个元素为1,则代表有动物进入收容所,第二个元素为动物的编号,正数代表狗,负数代表猫;若第一个元素为2,则代表有人收养动物,第二个元素若为0,则采取第一种收养方式,若为1,则指定收养狗,若为-1则指定收养猫。请按顺序返回收养的序列。若出现不合法的操作,即没有可以符合领养要求的动物,则将这次领养操作忽略。
测试样例:
[[1,1],[1,-1],[2,0],[2,-1]]
返回:[1,-1]
代码实现
#include <cstdio> #include <queue> #include <iostream> using namespace std; //定义动物结构体 struct Animal{ int number;//动物编号 int order;//次序 //使用成员初始化列表对数据成员初始化 Animal(int n,int o):number(n),order(o){} }; //定义猫狗两个队列 queue<Animal> cats; queue<Animal> dogs; enum adopt_type{ IN = 1, //有动物进入收容所 OUT = 2 //有人收养动物 }; // 有动物进入收容所 bool inAnimal(int type , int order){ //收养,次序和编号 if(type > 0){ dogs.push(Animal(type,order)); }else{ cats.push(Animal(type,order)); } } /** * 有人收养动物 */ int outAnimal(int type){ int number; if(type == 0){ if(cats.empty() && !dogs.empty()){ number = dogs.front().number; //返回的是元素中的一个属性,而不是结构体 dogs.pop(); //弹出队顶元素和出队是两个操作 }else if(dogs.empty() && !cats.empty()){ number = cats.front().number; cats.pop(); }else if(!dogs.empty() && !cats.empty() && dogs.front().order < cats.front().order){ number = dogs.front().number; dogs.pop(); }else if(!dogs.empty() && !cats.empty() && dogs.front().order > cats.front().order){ number = cats.front().number; cats.pop(); } }else if(type == 1 && !dogs.empty()){ number = dogs.front().number; dogs.pop(); }else if(type == -1 && !cats.empty()){ number = cats.front().number; cats.pop(); } return number; } int main(){ int n; int method,type,number; scanf("%d",&n); int order = 0; for(int i = 0;i < n;i++){ scanf("%d%d",&method,&type); if(method == IN){ inAnimal(type , order); order++; }else{ number = outAnimal(type); printf("%d",number); } } return 0; }
分析
读懂题意。用代码实现过程。
定义了两个队列去实现猫狗。