NYOJ-168房间安排


这个问题我用的一个线段区间来表示滴:

像这个图:

我举例的数据 :

2 3 4

4 5 5

1 8 4

5 2 10


这是转化的图:如 2 3 4 (3为头坐标,第几天居住加连住天数为3+4为尾坐标)


想一想有一条竖直的线从头2扫描到尾10,当竖线的坐标为6时,第一条线段、第二条线段、第4条线段与其相交。是不是就表示第一组数据和第二组数据还有第四组数据是并行的,而第三组数据在此时不用。此时所用的房间数SUM=11.令temp=max(sum);那temp是不是最小所需房间数?


这是我的代码:


#include<stdio.h>

#include<stdlib.h>

struct Node{

         introom;

         intwhen;

         intday;

}s[10000];

int com(const void *,const void *);

int main()

{

         inti,j;

         intT;

         intN;

         intsum;

         intmax,min;

         inttemp;

         scanf("%d",&T);

         while(T--)

         {

                   temp=0;

                   max=0;

                   min=10001;

                   scanf("%d",&N);

                   for(i=0;i<N;i++)

                   {

                            scanf("%d%d%d",&s[i].room,&s[i].when,&s[i].day);

                            if(max<s[i].day+s[i].when)

                                     max=s[i].day+s[i].when;

                            if(min>s[i].when)

                                     min=s[i].when;

                   }

                   qsort(s,N,sizeof(structNode),com);

                   for(i=min;i<=max;i++)

                   {

                            sum=0;

                            for(j=0;j<N;j++)

                            {

                                     if((i>=s[j].when)&&(i<s[j].when+s[j].day))

                                               sum+=s[j].room;

                                     if(i<s[j].when)

                                               break;

                            }

                            if(temp<sum)

                                     temp=sum;

                   }

                   printf("%d\n",temp);

         }

         return0;

}

int com(const void *a,const void *b)

{

         structNode *c;

         structNode *d;

         c=(structNode *)a;

         d=(structNode *)b;

         if(c->when!=d->when)

                   returnc->when-d->when;

         elsereturn (c->when+c->day)-(d->when+d->day);

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值