• 猫狗收养问题


    问题描述

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

    分析

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

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

  • 相关阅读:
    GO 语言使用copy 拷贝切片的问题
    ggplot 局部放大
    R语言hist重叠图作法
    illumina SNP 芯片转基因型矩阵
    Shell 变量嵌套
    JVM指令
    VUE—CLI学习
    Gradle 项目打开自动下载Zip问题及相关配置
    MySQL8服务无法启动,服务没有报告任何错误
    SpringMVC相关
  • 原文地址:https://www.cnblogs.com/juanzhi/p/12720485.html
Copyright © 2020-2023  润新知