acwing3300食材运输

 首先是30分的做法:

对一个树,找遍历其中几个点的最短路:

回到起点的做法:dfs遍历一遍,就是把每个边走了两倍。

不回到起点的做法:会停在某个点上。ans = 总长度 - 根到最后一个点的长度

(停在距离根节点最远的点上,ans最小)

这是一种贪心的思想,预处理出所有的起点进行遍历得到的最短路。 

 接着就是从k个食材中选m个

这个是非常经典的重复覆盖问题。

n行中选m行,使得每一列都有一个1.也就是找到每列都有一个1的话,最少有多少行?

Dancing Links

or 用状态压缩DP来做。愤怒的小鸟。

代码分析:

need[i][j] 表示 第i个酒店是否需要第j个食材

state表示选哪些起点

d[][]表示第i个酒店选第j个食材一共要走多少路

用邻接表存酒店直接的路和长度

迭代每个起点,每个食材,用一个dfs遍历求出从起点到遍历完所有需要食材的酒店后的边的长度的两倍,以及当前离起点最远的点的距离

再用一个二分法,列举所有状态压缩后的int,计算在这个状态中最少需要多少行能覆盖所有食材,如果行数大于m,就增大状态,直到找到一个最小的状态,它的

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在C语言中,编写一个简单的食材运输管理系统的代码涉及到数据结构(如数组、链表或结构体)以及基本的输入输出操作。这里我们假设创建一个简单的命令行程序,用于模拟运输食材到指定位置的过程。我们将使用结构体来表示食材运输队列。 ```c #include <stdio.h> #include <stdlib.h> // 食材结构体 typedef struct Ingredient { char name[50]; int quantity; } Ingredient; // 队列结构体,使用双向链表实现 typedef struct QueueNode { Ingredient ingredient; struct QueueNode* next; struct QueueNode* prev; } QueueNode; typedef struct Queue { QueueNode* front; QueueNode* rear; int size; } Queue; // 队列操作 void enqueue(Queue* q, Ingredient i); void dequeue(Queue* q); void display(Queue* q); int main() { Queue ingredientsQueue; QueueNode* newNode; // 初始化队列 enqueue(&ingredientsQueue, {"Tomatoes", 10}); enqueue(&ingredientsQueue, {"Carrots", 5}); enqueue(&ingredientsQueue, {"Potatoes", 8}); printf("Ingredients in the queue:\n"); display(&ingredientsQueue); // 模拟运输过程 printf("\nTransporting ingredients...\n"); dequeue(&ingredientsQueue); printf("%s transported.\n", ingredientsQueue.front->ingredient.name); return 0; } // 队列操作实现 void enqueue(Queue* q, Ingredient i) { newNode = (QueueNode*)malloc(sizeof(QueueNode)); newNode->ingredient = i; newNode->next = NULL; newNode->prev = q->rear; if (q->rear) q->rear->next = newNode; else q->front = newNode; q->rear = newNode; q->size++; } void dequeue(Queue* q) { if (q->front == NULL) return; QueueNode* temp = q->front; q->front = q->front->next; if (q->front) q->front->prev = NULL; else q->rear = NULL; free(temp); q->size--; } void display(Queue* q) { if (q->front == NULL) { printf("Queue is empty.\n"); return; } QueueNode* temp = q->front; while (temp != NULL) { printf("%s (quantity: %d)\n", temp->ingredient.name, temp->ingredient.quantity); temp = temp->next; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值