• 九度OJ 1334:占座位 (模拟)


    时间限制:1 秒

    内存限制:32 兆

    特殊判题:

    提交:864

    解决:202

    题目描述:

    sun所在学校的教室座位每天都是可以预占的。
    一个人可以去占多个座位,而且一定是要连续的座位,如果占不到他所要求的这么多座位,那么他就一个座位也不要了。为了降低难度,每次分配座位按座位号从小到大查找,采用最先适配法分配座位。

    输入:

    输入有多组数据。
    每组数据输入座位排数n,0<n<=100(座位的排列数相等,座位是按每行从左到右依次排序的),m( 0<m<=min(100,n*n) )个人。
    然后输入k(0<k<=100),最后输入k个命令。
    命令只有两种:
    1.in id num(代表id,0<=id<m,要占num个座位,若占不到连续的num(0<num<=20)个座位表示该命令无效)
    2.out id(代表id要释放他之前占的所有座位)
    注意:如果id之前占过座还没释放那么之后他的in命令都是无效的,
    如果id之前没占过座位那么他的out命令也是无效的。

    输出:

    对每个in命令输出yes或者no,如果命令有效则输出yes,无效则输出no。
    在yes no后面只带有回车,不带其他任何字符。

    样例输入:
    4 10
    9
    in 1 7
    in 2 3
    in 3 3
    in 3 3
    in 4 3
    out 2
    in 5 6
    out 3
    in 5 6
    样例输出:
    yes
    yes
    yes
    no
    yes
    no
    yes

    思路:

    数据结构用了结构体+链表,比较符合这个题的特点。

    这个题特别注意两个地方:

    如果id之前占过座还没释放那么之后他的in命令都是无效的,
    如果id之前没占过座位那么他的out命令也是无效的。


    代码:

    #include <stdio.h> 
    #include <stdlib.h>
    #include <string.h>
         
    #define N 100
         
    typedef struct node {
        int id;
        int begin;
        int end;
        struct node *next;
    } Person;
         
    Person *init(Person *head, int n)
    {       
        head = (Person *)malloc(sizeof(Person));
        head->id = -1;
        head->begin = head->end = 0;
        Person *tail = (Person *)malloc(sizeof(Person));
        tail->id = tail->begin = tail->end = n+1;
        head->next = tail;
        tail->next = NULL;
        return head;
    }       
             
    void print(Person *head)
    {
        while (head)
        {
            printf("%d %d %d
    ", head->id, head->begin, head->end);
            head = head->next;
        }
    }       
                 
    void insert(Person *head, int id, int num, int m)
    {       
        if (id < 0 || id >= m)
        {
            printf("no
    ");
            return;
        }   
         
        Person *p0, *p;
        p0 = head;
        p = p0->next;
        while (p != NULL)
        {
            if (p->id == id)
                break;
            p0 = p;
            p = p0->next;
        }
        if (p != NULL)
        {
            printf("no
    ");
            return;
        }
     
        p0 = head;
        p = p0->next;
        while (p != NULL)
        {
            if (p->id == id)
            {
                printf("no
    ");
                return;
            }
            if (p->begin - p0->end - 1 >= num)
                break;
            p0 = p;
            p = p0->next;
        }
        if (p == NULL)
        {
            printf("no
    ");
            return;
        }
     
        Person *pnew = (Person *)malloc(sizeof(Person));
        pnew->id = id;
        pnew->begin = p0->end + 1;
        pnew->end = p0->end + num;
        p0->next = pnew;
        pnew->next = p;
        printf("yes
    ");
    }   
         
    void out(Person *head, int id, int m)
    {       
        if (id < 0 || id >= m)
            return;
        Person *p0, *p;
        p0 = head;
        p = p0->next;
        while (p != NULL)
        {   
            if (p->id == id)
                break;
            p0 = p;
            p = p0->next;
        } 
        if (p == NULL)
        {
            return;
        }   
        p0->next = p->next;
        free(p);
    }       
             
    int main()  
    {       
        int n, m, k, i;
        Person *head;
        char op[5];
        int id;
        int num;
             
        while(scanf("%d%d%d", &n, &m, &k) != EOF)
        {
            n = n*n; 
            head = init(head, n);
            //print(head);
            for (i=0; i<k; i++)
            {
                scanf("%s%d", op, &id);
                if (strcmp(op, "in") == 0)
                {
                    scanf("%d", &num);
                    insert(head, id, num, m);
                }
                else
                    out(head, id, m);
                //printf("
    i=%d
    ", i);
                //print(head);
            }
        }
        return 0;
    }
    /**************************************************************
        Problem: 1334
        User: liangrx06
        Language: C
        Result: Accepted
        Time:60 ms
        Memory:912 kb
    ****************************************************************/


    编程算法爱好者。
  • 相关阅读:
    人性的经典总结54句
    系统程序员成长计划文本处理(XML解析器)
    系统程序员成长计划-像机器一样思考(二)
    Android输入事件流程
    系统程序员成长计划文本处理(INI解析器)
    request范围内共享属性 request_attribute.jsp
    系统程序员成长计划-像机器一样思考(三)
    系统程序员成长计划-像机器一样思考(一)
    Android IPC机制详解
    系统程序员成长计划文本处理(一)状态机(1)
  • 原文地址:https://www.cnblogs.com/liangrx06/p/5083799.html
Copyright © 2020-2023  润新知