工科楼北面的那个坑

工科楼北面的那个坑_第1张图片

工科楼北面的那个坑_第2张图片

#include <stdio.h>

#include <stdlib.h>


typedef struct mdata

{

    int *pTime;

    int width;

    int hight;

    struct mdata *pre;

    struct mdata *next;

}mhole;


mhole *setHole(mhole *,int ,int ,int *);    //插入结点

void pourTime(mhole *cur);                  //计算灌水时间

void printTime(int *pTime,int N);           //输出灌水时间


int main()

{

    mhole *left,*right,*pt,*curHole;

    int N,mCount;

    int mWidth,mHight;

    int *time;


    left = (mhole*)malloc (sizeof(mhole));   //初始化左边界

    left->width = 0;

    left->hight = 1000000;

    left->pTime = NULL;

    left->pre = left->next = NULL;



    scanf("%d",&N);

    time = (int*)calloc(N,sizeof(mhole));    //time分配空间


    pt = curHole = left;                     //当前结点,坑底位置最低结点

    for(mCount = 0;mCount<N;mCount++){

        scanf("%d%d",&mWidth,&mHight);

        curHole = setHole(curHole,mWidth,mHight,time+mCount);

        if(pt->hight > mHight)                //坑底位置最低结点

            pt = curHole;

    }

    right = setHole(curHole,0,1000000,NULL);


    pourTime(pt);

    printTime(time,N);


    return 0;

}

mhole *setHole(mhole *preHole,int width,int hight,int *ptime)

{

    mhole *curHole = (mhole *)malloc(sizeof(mhole));

    curHole->width = width;

    curHole->hight = hight;

    curHole->pTime = ptime;

    curHole->pre = preHole;

    curHole->next = NULL;


    preHole->next = curHole;

    return curHole;

}

void pourTime(mhole * curHole)

{

    mhole *cur = curHole,*pt;

    int myclock = 0;

    while(cur->pre->hight != cur->next->hight){

        *(cur->pTime) = myclock + cur->width;

        //计算当前时间,合并以灌满结点

        if(cur->pre->hight > cur->next->hight){

            myclock += (cur->next->hight - cur->hight)*cur->width;

            cur->next->width += cur->width;

            //摘下pt,释放结点

            cur->pre->next = cur->next;

            cur->next->pre = cur->pre;

            pt = cur;

            cur = cur->next;

            free(pt);

        }

        else{

            myclock += (cur->pre->hight - cur->hight)*cur->width;

            cur->pre->width += cur->width;


            cur->pre->next = cur->next;

            cur->next->pre = cur->pre;

            pt = cur;

            cur = cur->pre;

            free(pt);

        }

        //移动至下一结点,此结点为当前坑底最低位置

        if(cur->hight < cur->pre->hight&&cur->hight < cur->next->hight)

            continue;

        else if(cur->pre->hight > cur->next->hight){     //右移

            while(cur->hight > cur->next->hight)

                cur = cur->next;

            }else {

                while(cur->hight >cur->pre->hight)

                    cur = cur->pre;

            }

    }

    myclock += cur->width;

    *(cur->pTime) = myclock;

}

void printTime(int *pTime,int N)

{

    while(N--){

        printf("%d\n",*pTime++);

    }

}

你可能感兴趣的:(数据结构,栈,坑,工科楼)