有一个演讲大厅需要我们管理,演讲者们事先定好了需要演讲的起始时间和中止时间。 我们想让演讲大厅得到最大可能的使用。我们要接受一些预定而拒绝其他的预定,目标是使 演讲者使用大厅的时间最长。假设在某一时刻一个演讲结束,另一个演讲就可以立即开始。 请计算演讲大厅最大可能的使用时间。 输入格式: 第一行为一个整数 N,N≤5000,表示申请的数目。 以下 n 行每行包含两个整数 p,k,1 ≤ p < k ≤ 30000,表示这个申请的起始时间和中止时间。 输出格式: 一个整数,表示大厅最大可能的使用时间。#include<stdio.h> int main(){ int n; scanf("%d",&n); int p[5000],k[5000]; int i,j,t,m; for(i=0;i<n;i++) scanf("%d%d",&p,&k); for(i=0;i<n;i++){ for(j=i+1;j<n;j++){ if(k[i]>k[j]){ t=k[i]; k[i]=k[j]; k[j]=t; m=p[i]; p[i]=p[j]; p[j]=m; } } } }
时间: 2024-03-10 19:44:37 浏览: 102
这是一个经典的贪心问题,可以使用贪心算法来解决。首先,将所有的预定按照结束时间从小到大排序,然后依次考虑每个预定,如果当前预定的起始时间晚于上一个预定的结束时间,就可以接受这个预定,更新最大使用时间。否则,就拒绝这个预定。
下面是一个简单的 C++ 实现:
```cpp
#include <iostream>
#include <algorithm>
using namespace std;
struct Reservation {
int start, end;
};
bool cmp(const Reservation& a, const Reservation& b) {
return a.end < b.end;
}
int main() {
int n;
cin >> n;
Reservation r[n];
for (int i = 0; i < n; i++) {
cin >> r[i].start >> r[i].end;
}
sort(r, r + n, cmp);
int max_time = 0, last_end = 0;
for (int i = 0; i < n; i++) {
if (r[i].start >= last_end) {
max_time += r[i].end - r[i].start;
last_end = r[i].end;
}
}
cout << max_time << endl;
return 0;
}
```
这个算法的时间复杂度为 $O(n\log n)$,其中 $n$ 是预定的数量。
阅读全文