贪心

算法:以结束时间从小到大排序,枚举比当前开始时间小的剩余房间,有足够不另开房间

,没有足够的就加上缺少多少。

View Code
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<string>
#include<math.h>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
int T, N;

struct root
{
  int num, start, end;
  bool operator < ( const root &A) const
  { 
    if( (start+end) != (A.start+A.end)) 
      return (start+end) < (A.start + A.end);
    else
      return  start > A.start; 
  }
}room[300100];

int end[1100];

int main( )
{
  scanf("%d",&T);
  while( T-- )
  {
    scanf("%d",&N);
    for( int i = 1; i <= N; i++)
    {
       scanf("%d%d%d",&room[i].num,&room[i].start,&room[i].end);
    }
    sort( room + 1, room + N + 1);
    memset(end,0,sizeof(end));
    int ans = 0;
    for( int i = 1; i <= N; i++)
    {
       int x = room[i].start;
       int sum = 0, f = 0;
       int pub = 0;
       for( int j = x; j >= 1; j--)
       {
          sum += end[j];
          if( sum >= room[i].num )
          {
              f = 1;
              end[j] = end[j] - (room[i].num - pub);     
              break;
          }
          else
             end[j] = 0;
          pub  = sum;
               
       }
       if( f )
       {
           end[room[i].start + room[i].end] += room[i].num;
           continue;
       }
       else
       {
           ans += room[i].num - sum;
           end[room[i].start + room[i].end] += room[i].num;
       }      
    }
    printf("%d\n",ans);    
  }
  return 0;
}

posted on 2012-08-05 21:04  more think, more gains  阅读(128)  评论(0编辑  收藏  举报

导航