猫狗收养问题

问题描述

链接: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;     
}

分析

  读懂题意。用代码实现过程。

  定义了两个队列去实现猫狗。

posted @ 2020-04-17 15:52  天凉好个秋秋  阅读(260)  评论(0编辑  收藏  举报