送外卖

题目描述

冬天到了,小伙伴们都懒得出去吃饭了,纷纷打电话叫起了外卖。送外卖的小哥想找出一条最短的路径,小区门口进来,送完外卖又回到小区门口。

整个小区是一个由m*n个边长为1的正方形组成的矩形,各幢公寓楼分布于正方型的顶点上,小区门口位于左上角。每幢楼与相邻的八个方向的楼之间都有道路。

下图为m=2,n=3的小区地图,并且外卖小哥要经过的最短路径为6。

输入描述:

输入有多组数据。

每组数据包含两个整数m (2≤n≤2^128) 和n (2≤r≤2^128),分别代表行数和列数。


输出描述:

对应每一组数据,输出外卖小哥需要经过的最短路径。结果保留两位小数。

输入例子:

2 2
3 3

输出例子:

4.00

9.41

代码:

#include <iostream>  
#include <string>  
#include <vector>  
#include <stdlib.h>  
using namespace std;  

struct bigcheng{  
    vector<int> a;  
    vector<int> b;  
    string result_str;  
};  

//字符串转换为数字并反转
void chartonum(string a,string b,bigcheng &tempcheng){  
    int size_a = a.size();  
    int size_b = b.size();  
    for (int i = size_a-1;i >= 0;i--){  
        tempcheng.a.push_back(a[i] - '0');  
    }  
    for (int i = size_b-1;i >= 0;i--){  
        tempcheng.b.push_back(b[i] - '0');  
    }  
}  

//逐位相乘,处理进位消除多余的0  
void multiply(bigcheng &tempcheng,vector<int> &result_num){  
    for(int i = 0;i < tempcheng.a.size();i++){  
        for(int j = 0;j < tempcheng.b.size();j++){  
            result_num[i+j] += (tempcheng.a[i]) * (tempcheng.b[j]);//结果存放在result_num[i+j]中
        }  
    }  
    for (int i = result_num.size() - 1;i >= 0;i--){  
        if (result_num[i] != 0){  
            break;  
        }else  
            result_num.pop_back();  
    }  
    int c = 0;  
    for(int i = 0;i < result_num.size();i++){ //处理进位 
        result_num[i] += c;  
        c = result_num[i] / 10;  
        result_num[i] = result_num[i] % 10;  
    }  
    if(c != 0){  
        result_num.push_back(c);  
    }  
}  

//将计算结果转换为字符串并反转 
void numtochar(bigcheng &tempcheng,vector<int> &result_num){   
	int size = result_num.size();  
    for(int i = 0;i < result_num.size();i++){  
        tempcheng.result_str.push_back(static_cast<char>(result_num[size-1-i]+'0'));  
    }  
}  

int main(){
	string a,b;
    while(cin >> a >> b){
    	bigcheng tempcheng;   
    	chartonum(a,b,tempcheng);  
    	vector<int> resultnum(a.size()+b.size());  
    	multiply(tempcheng,resultnum);  
    	numtochar(tempcheng,resultnum);  
        if((tempcheng.result_str[tempcheng.result_str.size()-1]-'0') % 2 == 0){
            cout << tempcheng.result_str << ".00" << endl;
        }else{
        	cout << tempcheng.result_str << ".41" << endl;
		}
    }
}


小明外卖的问题通常出现在算法设计和动态规划的学习案例中,主要用来描述一个经典的资源分配与路径优化问题。以下是关于“小明外卖”的故事或背景的详细介绍: --- ### 背景介绍 小明是一名外卖骑手,在他的工作区域中有若干个小区需要配订单。每个小区都有一定的住户数量等待接收外卖,而每位住户的配时间固定为1小时。为了提高效率,公司安排了多名外卖员共同完成任务。然而,这些外卖员只能负责特定范围内的相邻小区配。 此问题的核心在于如何合理地分配有限的外卖员资源,使得所有住户都能按时收到外卖的同时,尽量减少总的配时间和成本。 --- ### 动态规划模型的应用 该问题可以通过动态规划的方法解决。假设存在以下条件: - 总共有$n$个小区待配。 - 第$i$个小区有$m_i$位住户需要服务。 - 共有$w$名外卖员参与配任务。 目标是最小化总配时间或者确保所有住户的需求被满足的情况下找到最优解法。 一种常见的解决方案包括定义状态转移方程以及边界条件设定等步骤来实现自动化计算过程。 --- ### 实际意义扩展思考 除了技术层面探讨外,“小明外卖”还可以引发更多社会经济学方面的讨论点比如劳动强度控制、收入公平性保障等方面议题值得进一步深入研究探索实践应用价值所在之处何在? --- #### 示例代码片段展示 (Python) 下面提供了一个简单的伪代码框架用于求解类似的小明外卖场景下的最短路径问题: ```python def min_delivery_time(n, m, w): # 初始化DP表 dp[i][j]表示前i个小区用j个外卖员所需的最小时间 dp = [[float('inf')] * (w + 1) for _ in range(n + 1)] # 边界条件设置 dp[0][0] = 0 # 填充表格 for i in range(1, n+1): # 当前处理第i个小区 for j in range(0, w+1): # 使用j个外卖员 if j == 0: continue # 如果没有外卖员,则无法完成任何配 # 枚举当前小区使用的外卖员数k for k in range(min(j,m[i-1])+1): dp[i][j] = min(dp[i][j], max(dp[i-1][j-k], time_to_deliver(k))) return dp[n][w] # 计算k个外卖员完成m_i单所需的时间 def time_to_deliver(k): return math.ceil(m / k) print(min_delivery_time(n, m, w)) ``` --- ### 注意事项说明 以上仅为简化版示例程序,实际项目开发过程中还需要考虑诸多细节因素例如异常情况处理机制等等以保证系统稳定可靠运行效果达到预期标准水平之上才行得通哦! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值