有一个演讲大厅需要我们管理,演讲者们事先定好了需要演讲的起始时间和中止时间。 我们想让演讲大厅得到最大可能的使用。我们要接受一些预定而拒绝其他的预定,目标是使 演讲者使用大厅的时间最长。假设在某一时刻一个演讲结束,另一个演讲就可以立即开始。 请计算演讲大厅最大可能的使用时间。 输入格式: 第一行为一个整数 N,N≤5000,表示申请的数目。 以下 n 行每行包含两个整数 p,k,1 ≤ p < k ≤ 30000,表示这个申请的起始时间和中止时间。 输出格式: 一个整数,表示大厅最大可能的使用时间。
时间: 2024-04-26 11:24:08 浏览: 16
这是一道经典的贪心算法问题,我们可以按照演讲的结束时间从早到晚进行排序,然后依次选择结束时间最早的演讲进行安排。如果当前选择的演讲时间和之前已经安排好的演讲时间不重叠,那么就可以安排这个演讲,否则就不能安排。最后统计所有已经安排的演讲时间长度即可。
具体实现时,我们可以使用一个变量记录当前已经安排的演讲的结束时间,然后对所有演讲按照结束时间从早到晚排序,依次遍历每个演讲,如果这个演讲的起始时间晚于当前已经安排的演讲的结束时间,那么就可以安排这个演讲,更新当前的结束时间。最终统计所有已经安排的演讲时间长度即可。
以下是 Python 代码实现:
相关问题
用c语言动态规划写下面题目有一个演讲大厅需要我们管理,演讲者们事先定好了需要演讲的起始时间和中止时间。 我们想让演讲大厅得到最大可能的使用。我们要接受一些预定而拒绝其他的预定,目标是使 演讲者使用大厅的时间最长。假设在某一时刻一个演讲结束,另一个演讲就可以立即开始。 请计算演讲大厅最大可能的使用时间。 输入格式: 第一行为一个整数 N,N≤5000,表示申请的数目。 以下 n 行每行包含两个整数 p,k,1 ≤ p < k ≤ 30000,表示这个申请的起始时间和中止时间。 输出格式: 一个整数,表示大厅最大可能的使用时间。 输入样例1: 5 0 3 2 6 5 7 1 5 5 9 输出样例1: 8
以下是C语言动态规划代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int start, end;
} Meeting;
int cmp(const void *a, const void *b) {
Meeting *ma = (Meeting *)a, *mb = (Meeting *)b;
return ma->end - mb->end;
}
int main() {
int n;
scanf("%d", &n);
Meeting *meetings = (Meeting *)malloc(n * sizeof(Meeting));
for (int i = 0; i < n; i++) {
scanf("%d%d", &meetings[i].start, &meetings[i].end);
}
qsort(meetings, n, sizeof(Meeting), cmp);
int *dp = (int *)calloc(n, sizeof(int));
dp[0] = meetings[0].end - meetings[0].start;
int max_time = dp[0];
for (int i = 1; i < n; i++) {
dp[i] = meetings[i].end - meetings[i].start;
for (int j = i - 1; j >= 0; j--) {
if (meetings[i].start >= meetings[j].end) {
dp[i] = dp[j] + meetings[i].end - meetings[i].start;
break;
}
}
if (dp[i] > max_time) {
max_time = dp[i];
}
}
printf("%d\n", max_time);
free(meetings);
free(dp);
return 0;
}
```
注释说明:
- 与前一个问题相似,首先定义结构体 `Meeting`,表示每个预定的起始时间和中止时间。
- 定义比较函数 `cmp`,用于将所有预定按照结束时间从小到大排序。
- 读入预定数据,并按照结束时间从小到大排序。
- 定义动态规划数组 `dp`,表示前 `i` 个预定中,选择第 `i` 个预定时最多能使用的时间,即当前预定的使用时间加上前面最多能使用的时间。
- 初始化 `dp[0] = meetings[0].end - meetings[0].start`,表示第一个预定的最大使用时间为该预定的时间长度。
- 对于每个 `i`,从 `i-1` 到 0 的范围内寻找能与第 `i` 个预定不冲突的最大 `j`,然后更新 `dp[i] = dp[j] + meetings[i].end - meetings[i].start`。
- 在每次更新 `dp[i]` 时,记录当前 `dp` 数组中的最大值 `max_time`。
- 最后输出 `max_time` 即为答案。
时间复杂度为 $O(n^2)$,可以通过本题,但对于数据量较大的情况下可能会超时。可以使用其他算法进行优化。
用C++写一个演讲比赛管理系统
好的,下面是一个简单的演讲比赛管理系统的C代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义参赛者结构体
typedef struct {
char name[20]; // 姓名
char gender; // 性别
int age; // 年龄
char topic[50]; // 演讲主题
float score; // 得分
} Contestant;
// 定义比赛结构体
typedef struct {
char name[50]; // 比赛名称
char date[20]; // 比赛日期
int num; // 参赛人数
Contestant *contestants; // 参赛者数组
} Contest;
// 定义函数
void addContestant(Contest *contest);
void showContestants(Contest contest);
void deleteContestant(Contest *contest);
void modifyContestant(Contest *contest);
void sortContestants(Contest *contest);
void showResult(Contest contest);
void saveToFile(Contest contest);
void readFromFile(Contest *contest);
int main() {
Contest contest;
int choice;
printf("===============欢迎使用演讲比赛管理系统===============\n\n");
printf("请选择操作:\n");
printf("1. 添加参赛者\n");
printf("2. 查看参赛者\n");
printf("3. 删除参赛者\n");
printf("4. 修改参赛者信息\n");
printf("5. 按分数排序\n");
printf("6. 显示比赛结果\n");
printf("7. 保存比赛结果到文件\n");
printf("8. 从文件中读取比赛结果\n");
printf("9. 退出系统\n\n");
while (1) {
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
addContestant(&contest);
break;
case 2:
showContestants(contest);
break;
case 3:
deleteContestant(&contest);
break;
case 4:
modifyContestant(&contest);
break;
case 5:
sortContestants(&contest);
break;
case 6:
showResult(contest);
break;
case 7:
saveToFile(contest);
break;
case 8:
readFromFile(&contest);
break;
case 9:
printf("\n谢谢使用!\n");
exit(0);
default:
printf("\n输入有误,请重新输入!\n\n");
break;
}
}
return 0;
}
// 添加参赛者
void addContestant(Contest *contest) {
printf("\n添加参赛者:\n");
// 动态分配内存
contest->num++;
contest->contestants = (Contestant *) realloc(contest->contestants, contest->num * sizeof(Contestant));
// 输入参赛者信息
Contestant *c = &contest->contestants[contest->num - 1];
printf("请输入姓名:");
scanf("%s", c->name);
printf("请输入性别:");
scanf(" %c", &(c->gender));
printf("请输入年龄:");
scanf("%d", &(c->age));
printf("请输入演讲主题:");
scanf("%s", c->topic);
c->score = 0;
printf("\n添加成功!\n\n");
}
// 查看参赛者
void showContestants(Contest contest) {
printf("\n参赛者信息:\n");
// 遍历参赛者数组
for (int i = 0; i < contest.num; i++) {
Contestant c = contest.contestants[i];
printf("姓名:%s\t性别:%c\t年龄:%d\t演讲主题:%s\t得分:%.2f\n", c.name, c.gender, c.age, c.topic, c.score);
}
printf("\n");
}
// 删除参赛者
void deleteContestant(Contest *contest) {
char name[20];
int index = -1;
printf("\n删除参赛者:\n");
printf("请输入要删除的参赛者姓名:");
scanf("%s", name);
// 遍历参赛者数组查找要删除的参赛者
for (int i = 0; i < contest->num; i++) {
if (strcmp(contest->contestants[i].name, name) == 0) {
index = i;
break;
}
}
// 如果找到了要删除的参赛者
if (index != -1) {
// 将后面的参赛者向前移动一个位置
for (int i = index; i < contest->num - 1; i++) {
contest->contestants[i] = contest->contestants[i + 1];
}
// 动态分配内存
contest->num--;
contest->contestants = (Contestant *) realloc(contest->contestants, contest->num * sizeof(Contestant));
printf("\n删除成功!\n\n");
} else {
printf("\n未找到该参赛者!\n\n");
}
}
// 修改参赛者信息
void modifyContestant(Contest *contest) {
char name[20];
int index = -1;
printf("\n修改参赛者信息:\n");
printf("请输入要修改的参赛者姓名:");
scanf("%s", name);
// 遍历参赛者数组查找要修改的参赛者
for (int i = 0; i < contest->num; i++) {
if (strcmp(contest->contestants[i].name, name) == 0) {
index = i;
break;
}
}
// 如果找到了要修改的参赛者
if (index != -1) {
Contestant *c = &contest->contestants[index];
printf("请输入新的演讲主题:");
scanf("%s", c->topic);
printf("\n修改成功!\n\n");
} else {
printf("\n未找到该参赛者!\n\n");
}
}
// 按分数排序
void sortContestants(Contest *contest) {
// 使用冒泡排序
for (int i = 0; i < contest->num - 1; i++) {
for (int j = 0; j < contest->num - i - 1; j++) {
if (contest->contestants[j].score < contest->contestants[j + 1].score) {
Contestant temp = contest->contestants[j];
contest->contestants[j] = contest->contestants[j + 1];
contest->contestants[j + 1] = temp;
}
}
}
printf("\n排序成功!\n\n");
}
// 显示比赛结果
void showResult(Contest contest) {
printf("\n比赛结果:\n");
// 遍历参赛者数组
for (int i = 0; i < contest.num; i++) {
Contestant c = contest.contestants[i];
printf("姓名:%s\t性别:%c\t年龄:%d\t演讲主题:%s\t得分:%.2f\n", c.name, c.gender, c.age, c.topic, c.score);
}
printf("\n");
}
// 保存比赛结果到文件
void saveToFile(Contest contest) {
FILE *fp = fopen("contest.txt", "w");
// 写入比赛名称、日期、参赛人数
fprintf(fp, "%s\n%s\n%d\n", contest.name, contest.date, contest.num);
// 遍历参赛者数组,写入每个参赛者的信息
for (int i = 0; i < contest.num; i++) {
Contestant c = contest.contestants[i];
fprintf(fp, "%s %c %d %s %.2f\n", c.name, c.gender, c.age, c.topic, c.score);
}
fclose(fp);
printf("\n保存成功!\n\n");
}
// 从文件中读取比赛结果
void readFromFile(Contest *contest) {
FILE *fp = fopen("contest.txt", "r");
if (fp == NULL) {
printf("\n文件不存在!\n\n");
return;
}
// 读取比赛名称、日期、参赛人数
fscanf(fp, "%s%s%d", contest->name, contest->date, &contest->num);
// 动态分配内存
contest->contestants = (Contestant *) malloc(contest->num * sizeof(Contestant));
// 读取每个参赛者的信息
for (int i = 0; i < contest->num; i++) {
Contestant *c = &contest->contestants[i];
fscanf(fp, "%s %c %d %s %f", c->name, &(c->gender), &(c->age), c->topic, &(c->score));
}
fclose(fp);
printf("\n读取成功!\n\n");
}
```
这个演讲比赛管理系统可以实现以下功能:
1. 添加参赛者
2. 查看参赛者
3. 删除参赛者
4. 修改参赛者信息
5. 按分数排序
6. 显示比赛结果
7. 保存比赛结果到文件
8. 从文件中读取比赛结果
9. 退出系统
你可以根据自己的需求进行修改和扩展。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)