贪心
算法:以结束时间从小到大排序,枚举比当前开始时间小的剩余房间,有足够不另开房间
,没有足够的就加上缺少多少。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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) 编辑 收藏 举报