UVA - 607 Scheduling Lectures(贪心+记忆化搜索)

本文探讨了如何合理安排课程以满足学生在有限时间内掌握多个主题的需求,并通过贪心算法与记忆化搜索技术,实现课程时长与学生满意度的最优平衡。通过实例分析,展示了在不同课程需求与时间限制下,如何最小化剩余时间导致的不满意程度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

有n个主题。每堂课的时间是L。每个主题各要求t1,t2,…tn(1<=ti<=L)。对于每个主题,你要决定要哪堂课教。并且有如下的规则:
1.每个主题必须完整地包含在一堂课里。不能分成两部分教。
2.主题之间的顺序不能调换,即主题i必须在主题i+1之前教。
同时,如果在每堂课的最后如果能留有10分钟以内的时候,那么学生的不满意程序是最小的。不满意程度的计算如下所示:
D=0(如果剩下的时间是0)。
D=-c(如果剩下的时间在10分钟以内)。
D=(t-10)^2(剩下的情况)

思路:

前一步利用贪心,可以算出最少课时,就是尽量让多的课挤到一起上,然后在用记忆化搜索,求出该课时下最小满意度。
其中dp[i, j]表示前i节课,覆盖j个知识点的最小不满意度。

AC代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
int dp[1005][1005] ,t[1005];
bool vis[1005][1005];
int C, L, n;
int DI(int time) {
    if(time == 0) {
        return 0;
    }else if(1 <= time && time <= 10) {
        return -C;
    }else {
        return (time - 10) * (time - 10);
    }
}
int solve() {
    int sum = 0 ,cnt = 1;
    for(int i = 1; i <= n; i++) {
        sum += t[i];
        if(sum > L) {
            sum = t[i];
            cnt++;
        }
    }
    return cnt;
}
int dps(int x,int y) {
    if(x == 0) {
        return y ? INF : 0;
    }
    if(vis[x][y]) {
        return dp[x][y];
    }
    dp[x][y] = INF;
    int sum = 0;
    for(int i = y; i > 0; i--) {
        sum += t[i];
        if(sum > L)
            break;
        int ans = dps(x-1, i-1);
        if(ans != INF) {
            dp[x][y] = min(dp[x][y], ans + DI(L - sum));
        }
    }
    vis[x][y] = true;
    return dp[x][y];
}
int main() {
    int cas = 1;
    int flag = 0;
    while(scanf("%d",&n) != EOF && n) {
        if(flag++) {
            printf("\n");
        }
        scanf("%d%d",&L,&C);
        for(int i = 1; i <= n; i++) {
            scanf("%d",&t[i]);
        }
        int cnt = solve();

        memset(dp,0,sizeof(dp));
        memset(vis,false,sizeof(vis));

        printf("Case %d:\n",cas++);
        printf("Minimum number of lectures: %d\n",cnt);
        printf("Total dissatisfaction index: %d\n",dps(cnt, n));
    }
    return 0;
}
### OpenStack 架构思维导图 #### 控制层 控制层主要负责管理整个云环境中的各种服务和资源分配。以下是控制层的主要组件及其功能: - **Nova (Compute Service)** Nova 是 OpenStack 的核心计算服务,用于管理和编排虚拟机实例的生命周期[^1]。它通过调度器决定在哪台物理主机上启动虚拟机,并与底层 Hypervisor 进行通信。 - **Glance (Image Service)** Glance 提供了一个集中式的镜像管理系统,支持多种格式的虚拟机镜像文件(如 qcow2, raw, vmdk)。它可以存储、检索和发现虚拟机镜像[^1]。 - **Cinder (Block Storage Service)** Cinder 负责为虚拟机提供持久化的块存储设备。它允许用户创建、挂载和卸载卷,并支持不同类型的后端存储解决方案[^1]。 --- #### 存储层 存储层提供了数据持久性和高可用性的保障,通常由分布式存储系统实现。 - **Ceph RBD (RADOS Block Device)** Ceph 是一种分布式的对象存储和块设备解决方案,RBD 是其提供的块设备接口。Ceph 支持动态扩展、自我修复以及高性能的数据读写操作[^1]。 - **Libvirt** Libvirt 是一个开源 API 和工具集,用于管理 KVM/QEMU 等 Hypervisors。它是连接 OpenStack Nova 组件与底层硬件的关键桥梁。 - **RADOS 协议** RADOS(Reliable Autonomic Distributed Object Store)是 Ceph 的核心协议,实现了数据的可靠性和一致性。RADOS 将数据分布在集群中的多个节点上,从而提高系统的容错能力[^1]。 --- ### 思维导图结构建议 以下是一个基于 OpenStack 架构的思维导图框架: ```plaintext OpenStack Architecture ├── Control Layer │ ├── Nova (Compute Service) │ │ └── Manages VM lifecycle and scheduling │ ├── Glance (Image Service) │ │ └── Provides image management capabilities │ └── Cinder (Block Storage Service) │ └── Offers persistent block storage for VMs └── Storage Layer ├── Ceph RBD (RADOS Block Device) │ └── High-performance distributed block storage ├── Libvirt │ └── Interfaces with hypervisors like QEMU/KVM └── RADOS Protocol └── Ensures data reliability and consistency across nodes ``` 此思维导图可以进一步细化到具体的服务模块和技术细节,例如 Neutron(网络服务)、Keystone(身份认证服务)等。 --- ### 示例代码:生成简单的树状结构 如果需要程序化生成类似的思维导图,可以用 Python 实现如下逻辑: ```python def generate_mind_map(): mind_map = { "OpenStack Architecture": { "Control Layer": ["Nova", "Glance", "Cinder"], "Storage Layer": ["Ceph RBD", "Libvirt", "RADOS Protocol"] } } def print_tree(data, level=0): for key, value in data.items(): print(" " * level + str(key)) if isinstance(value, dict): print_tree(value, level + 1) elif isinstance(value, list): for item in value: print(" " * (level + 1) + "- " + str(item)) print_tree(mind_map) generate_mind_map() ``` 运行以上脚本会打印出类似于上面提到的树形结构。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值