餐桌问题

题目:有n张桌子,m批人,每张桌子容纳的最大人数为h,每批人的人数为a,预计消费为c,每张桌子坐的人数不能大于h,不能拼桌和分桌,同一张桌子只能容纳同一批人,求怎么样消费是餐馆获利最高。

#include <iostream>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
struct Person{//每一批顾客
    int b;
    int c;
};
int cmp(Person x,Person y){
    if (x.c == y.c)
        return x.b < y.b;//再按人数升序
    return x.c > y.c; //先按金额降序
}

int main(){
    int n,m;
    long long ans=0;
    vector<Person> v;//存的每一批顾客这个结构体!!!
    multiset<int> s;//存储每个桌子的容量!!!
    cin>>n>>m;//桌子数和批次
    for(int i = 0; i < n; i++){
        int x;
        cin>>x;//每个桌子的容量
        s.insert(x);
    }
    for(int i = 0; i < m; i++){
        int x, y;//每一批的人数和金额
        cin>>x>>y;
        Person tmp;
        tmp.b = x, tmp.c = y;
        v.push_back(tmp);//将该结构体放到vector
    }
    sort(v.begin(),v.end(),cmp);//把顾客按消费金额降序,人数升序排序
    for(int i = 0; i < m; i++){//对于已排好序的顾客,遍历匹配,优先处理金额大的
        //set::lower_bound(key):返回set中第一个大于或等于key的迭代器指针
        //v[i].b代表这一批顾客的人数,要找到一个桌子刚好容纳他
        multiset<int>::iterator it = s.lower_bound(v[i].b);//!!!!!
        if (it != s.end()){
            s.erase(it);//如果该桌子上可以容纳这批顾客,则占用,即删除这个桌子
            ans += v[i].c;//可以容纳后,则加上该批顾客的金额
        }
    }
    cout<<ans<<endl;//最大获利数
}
### RT-Thread 操作系统中的餐桌服务员示例 在嵌入式实时操作系统 (RTOS) 如 RT-Thread 中实现类似餐桌服务员的功能,可以通过创建多个线程来模拟顾客服务员的行为。为了确保数据的一致性可见性,可以采用 `synchronized` 或者 `volatile` 关键字处理共享资源访问[^3]。 下面是一个简单的例子,在这个场景里有两个主要角色:顾客服务器。每个顾客会发出订单请求,而服务员负责接收这些请求并提供相应的服务: #### 创建项目结构 首先定义两个类分别代表顾客餐厅服务员,并通过消息队列来进行通信。 ```c #include "rtthread.h" #define CUSTOMER_NUM 5 /* 定义顾客数量 */ #define MSG_QUEUE_SIZE 10 /* 设置消息队列大小 */ /* 声明全局的消息队列句柄 */ static struct rt_messagequeue* order_queue; typedef enum { ORDER_DRINK, ORDER_FOOD, } OrderType; ``` #### 实现顾客行为逻辑 每位顾客将随机选择一种菜品下单给服务员。 ```c void customer_thread_entry(void *parameter) { int id = *(int*) parameter; // 获取当前顾客ID while(1){ rt_uint8_t msg_type; switch(rt_rand() % 2){ // 随机决定要喝饮料还是吃饭 case 0: msg_type = ORDER_DRINK; break; default: msg_type = ORDER_FOOD; } printf("Customer%d wants to place an order.\n",id); if(rt_mq_send(order_queue,&msg_type,sizeof(msg_type),RT_WAITING_FOREVER)==RT_EOK){ printf("Order placed by Customer%d\n",id); }else{ printf("Failed to send message from Customer%d!\n",id); } rt_thread_delay(rt_tick_from_millisecond((rand()%5+1)*100)); // 等待一段时间再下一次单 } } ``` #### 处理服务员的任务分配 当收到新订单时,服务员读取消息内容并向对应的顾客反馈已接受其请求。 ```c void waiter_thread_entry(void *parameter) { char received_msg; while(1){ if(rt_mq_recv(order_queue,(char*)&received_msg,sizeof(received_msg),RT_WAITING_FOREVER)==RT_EOK){ switch(received_msg){ case ORDER_DRINK: printf("Waiter has taken the drink order and will serve it soon...\n"); break; case ORDER_FOOD: printf("Waiter has taken the food order and will prepare it now...\n"); break; } rt_thread_delay(rt_tick_from_millisecond(rand()%300 + 200)); // 模拟准备时间 printf("The ordered item was served successfully.\n"); } else { printf("Error receiving message in Waiter thread.\n"); } } } ``` #### 初始化函数设置 最后一步是在应用程序入口处初始化上述组件以及启动各个线程。 ```c int main() { int i,customer_ids[CUSTOMER_NUM]; /* 创建用于传递订单的消息队列 */ order_queue=rt_mq_create("order_q",(sizeof(OrderType))*MSG_QUEUE_SIZE,RT_IPC_FLAG_FIFO); /* 启动服务员线程 */ rt_thread_t waiter_tid = rt_thread_create( "waiter", waiter_thread_entry, RT_NULL, 1024, 25, 10 ); if(waiter_tid != RT_NULL) rt_thread_startup(waiter_tid); /* 循环创建指定数目的顾客线程 */ for(i=0;i<CUSTOMER_NUM;++i){ customer_ids[i]=i+1; rt_thread_t cust_tid = rt_thread_create( "customer", customer_thread_entry, &customer_ids[i], 512, 26+i%5, 10 ); if(cust_tid!=RT_NULL) rt_thread_startup(cust_tid); } return 0; } ``` 此程序展示了如何利用 RT-Thread 的多线程机制构建一个基本的服务模型。实际应用中可能还需要考虑更多细节,比如错误处理、超时管理等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值