这两个题是一类的题目。
就是典型的酒店安排房间以及饭店安排座椅等的问题。在生活中,是很常见的问题, 很有实用性。
nyoj 上的数据较水,也可以暴力就过的。
这是巧妙的用法,很是令人折服。 把开始时间和结束时间hash到数组上就可以了。开始时间的位置+k,表示在该时间入住k个房间,结束时间-k,表示在该事件空出k 个房间。个中奥妙还是仔细体会一下,很有技巧性的一类问题。。
Code:(以hdu 4883 为例)
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 1445;
int hash[N];
int main(){
int T;
scanf("%d", &T);
while(T --){
memset(hash, 0, sizeof(hash));
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++){
int k, x1, y1, x2, y2, bt, et;
scanf("%d %d:%d %d:%d", &k, &x1, &y1, &x2, &y2);
bt = x1 * 60 + y1;
et = x2 * 60 + y2;
hash[bt] += k;
hash[et] -= k;
}
int ans = -1, sum = 0;
for(int i = 0; i <= 1440; i ++){
sum += hash[i];
if(sum > ans) ans = sum;
}
printf("%d\n", ans);
}
return 0;
}
技巧常常会令人震惊。。