E:rin和快速迭代

2020牛客寒假算法基础集训营1

传送门

题意:

在这里插入图片描述

思路:

直接o(sqrt(n))求因子的个数,结束的标志就是遇到了素数,因为素数的因子只有两个

代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <math.h>
#include <map>
#include <queue>
#include <set>
using namespace std;
typedef long long ll;
const int maxn=1e5+50;
const int inf=0x3f3f3f3f;
ll gg(ll x){//求因子个数
    ll ans=0;
    for(ll i=1;i*i<=x;i++){
        if(x%i==0){
            if(i*i!=x)ans+=2;
            else ans++;
        }
    }
    return ans;
}
int pp(ll x){//判断素数
    int flag=1;
    for(int i=2;i*i<=x;i++){
        if(x%i==0){
            flag=0;
            break;
        }
    }
    return flag;
}
int main()
{
    ll n;
    scanf("%lld",&n);
    ll ans=1;
    while(!pp(n)){
        n=gg(n);
        ans++;
    }
    printf("%lld\n",ans);
    return 0;
}

出题人代码:

写的更简单一点

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll f(ll x){             //求x的因子个数
    ll i,res=0;
    for(i=1;i*i<x;i++){
        if(x%i==0)res+=2;
    }
    return res+(i*i==x);
}
int main(){
    ll i=0,n;
    cin>>n;
    while(n!=2)n=f(n),i++;
    cout<<i;
}
团队作业:灾后大规模救援物资分配车辆路径优化与 高效启发式函数设计 背景: 在个人作业中,我们对多车辆路径规划问题进行了一些基础扩展。现在,作为团 队,你们将面临更复杂的场景更大的问题规模,核心挑战在于设计评估更智能 的启发式函数,以提高A*搜索算法的效率解的质量。 作业目标: 1. 在个人作业的基础上,引入“优先村庄”的概念,并调整算法以适应新的优 化考量。 2. 设计、实现并评估至少两种新的、可能更有效的启发式函数。 3. 处理并解决一个预定义的大规模车辆路径规划问题。 4. 通过实验对比不同启发式函数在解决大规模问题时的性能。 问题描述与扩展要求: 1. 优先村庄 (Priority Villages): o 某些村庄可能由于其重要性或紧急性,需要优先得到配送。 o 修改:  在问题定义中(例如,demands 字典或一个单独的列表)标识 出哪些村庄是“优先村庄”。  调整优化目标或约束:  方案A (硬约束): 所有优先村庄的需求必须在某个较 早的全局时间上限 priority_deadline 内得到完全满 足,否则该路径无效。  方案B (软目标/启发式引导): 在启发式函数或状态比 较 (State.__lt__) 中给予优先村庄的未满足需求更高 的权重,或者在满足优先村庄需求方面取得进展的状态 更高的优先级。  你需要选择一种方案(或提出自己的方案)来实现对优先村庄 的处理,并在报告中阐述理由。相应地,你可能需要修改 is_goal (如果采用硬约束方案A)、successors (如果需要检 查 priority_deadline)、heuristic State.__lt__ 方 法。 2. 大规模问题实例: o 提供的大规模测试算例: 你们在开发初步测试时,应使用以下固 定的算例。请将这些数据结构复制到你们的Python代码的起始部分 或一个单独的配置文件中。 # 大规模算例数据 nodes_data_large = { 1: (0, 0), 2: (5, 149), 3: (118, 103), 4: (140, 132), 5: (102, 108), 6: (90, 63), 7: (110, 140), 8: (18, 137), 9: (109, 130), 10: (100, 137), 11: (142, 145), 12: (61, 12), 13: (40, 118), 14: (111, 10), 15: (147, 36), 16: (123, 129), 17: (128, 81), 18: (13, 132), 19: (10, 80), 20: (70, 140), 21: (28, 50), 22: (11, 138), 23: (111, 113), 24: (148, 108), 25: (93, 14), 26: (149, 78), 27: (1, 104), 28: (102, 3), 29: (12, 13), 30: (81, 118), 31: (110, 11), 32: (122, 117), 33: (136, 101), 34: (13, 101), 35: (141, 14) } graph_data_large = { 1: [(2, 149.1, 6), (35, 141.0, 3), (29, 17.7, 7), (25, 94.0, 3), (21, 57.3, 7), (12, 62.2, 6)], 2: [(1, 149.1, 6), (3, 120.0, 7), (8, 13.9, 7), (20, 65.2, 7), (22, 6.1, 6), (27, 45.1, 3)], 3: [(2, 120.0, 7), (4, 30.4, 3), (5, 17.0, 5), (10, 37.6, 7), (16, 10.0, 6), (23, 7.1, 4)], 4: [(3, 30.4, 3), (5, 41.8, 8), (7, 31.6, 5), (11, 13.3, 7), (16, 17.7, 5), (24, 24.7, 6)], 5: [(3, 17.0, 5), (4, 41.8, 8), (6, 47.4, 8), (9, 23.0, 6), (17, 30.0, 7), (23, 10.2, 7)], 6: [(5, 47.4, 8), (7, 54.1, 5), (12, 59.1, 7), (17, 38.0, 3), (19, 82.0, 4), (25, 49.2, 7)], 7: [(4, 31.6, 5), (6, 54.1, 5), (8, 92.0, 5), (11, 32.0, 5), (16, 18.4, 6), (20, 40.0, 7)], 8: [(2, 13.9, 7), (7, 92.0, 5), (9, 91.0, 5), (13, 28.6, 6), (18, 5.8, 5), (22, 7.1, 6)], 9: [(5, 23.0, 6), (8, 91.0, 5), (10, 11.4, 6), (16, 13.0, 7), (23, 19.2, 5), (30, 30.5, 6)], 10: [(3, 37.6, 7), (9, 11.4, 6), (11, 42.8, 7), (16, 26.4, 4), (20, 30.2, 3), (30, 24.2, 7)], 11: [(4, 13.3, 7), (7, 32.0, 5), (10, 42.8, 7), (16, 19.9, 5), (20, 32.8, 7), (32, 33.9, 6)], 12: [(1, 62.2, 6), (6, 59.1, 7), (14, 50.0, 6), (19, 53.1, 7), (21, 53.1, 6), (29, 49.0, 8)], 13: [(8, 28.6, 6), (18, 27.0, 8), (19, 46.1, 5), (27, 40.8, 6), (30, 7.1, 6), (34, 27.9, 4)], 14: [(12, 50.0, 6), (15, 43.2, 6), (17, 72.8, 5), (25, 18.4, 6), (28, 12.0, 7), (31, 0.0, 5)], 15: [(14, 43.2, 6), (17, 50.1, 7), (26, 42.2, 4), (28, 51.1, 4), (31, 41.1, 8), (35, 23.3, 7)], 16: [(3, 10.0, 6), (4, 17.7, 5), (7, 18.4, 6), (9, 13.0, 7), (10, 26.4, 4), (11, 19.9, 5)], # Degree 6 17: [(5, 30.0, 7), (6, 38.0, 3), (14, 72.8, 5), (15, 50.1, 7), (23, 34.0, 3), (26, 21.2, 7)], 18: [(8, 5.8, 5), (13, 27.0, 8), (19, 52.0, 7), (22, 7.8, 6), (27, 13.3, 6), (34, 31.0, 3)], 19: [(6, 82.0, 4), (12, 53.1, 7), (13, 46.1, 5), (18, 52.0, 7), (21, 34.5, 5), (27, 26.0, 7)], 20: [(2, 65.2, 7), (7, 40.0, 7), (10, 30.2, 3), (11, 32.8, 7), (22, 59.0, 7), (30, 30.5, 3)], 21: [(1, 57.3, 7), (12, 53.1, 6), (19, 34.5, 5), (29, 39.8, 7), (34, 53.2, 8)], 22: [(2, 6.1, 6), (8, 7.1, 6), (18, 7.8, 6), (20, 59.0, 7), (27, 10.0, 6)], 23: [(3, 7.1, 4), (5, 10.2, 7), (9, 19.2, 5), (17, 34.0, 3), (30, 31.0, 8), (32, 11.0, 5)], 24: [(4, 24.7, 6), (26, 43.2, 3), (32, 29.7, 7), (33, 14.6, 6), (35, 94.6, 5)], 25: [(1, 94.0, 3), (6, 49.2, 7), (14, 18.4, 6), (28, 9.9, 3), (31, 18.0, 7)], 26: [(15, 42.2, 4), (17, 21.2, 7), (24, 43.2, 3), (28, 76.2, 7), (33, 26.0, 7), (35, 20.0, 6)], 27: [(2, 45.1, 3), (13, 40.8, 6), (18, 13.3, 6), (19, 26.0, 7), (22, 10.0, 6), (34, 12.0, 8)], 28: [(1, 102.0, 6), (14, 12.0, 7), (15, 51.1, 4), (25, 9.9, 3), (26, 76.2, 7), (31, 7.1, 6)], 29: [(1, 17.7, 7), (12, 49.0, 8), (21, 39.8, 7), (34, 88.1, 5)], 30: [(9, 30.5, 6), (10, 24.2, 7), (13, 7.1, 6), (20, 30.5, 3), (23, 31.0, 8), (32, 42.0, 6)], 31: [(14, 0.0, 5), (15, 41.1, 8), (25, 18.0, 7), (28, 7.1, 6), (35, 6.1, 6)], 32: [(11, 33.9, 6), (23, 11.0, 5), (24, 29.7, 7), (30, 42.0, 6), (33, 18.4, 8)], 33: [(24, 14.6, 6), (26, 26.0, 7), (32, 18.4, 8), (35, 87.4, 5)], 34: [(13, 27.9, 4), (18, 31.0, 3), (21, 53.2, 8), (27, 12.0, 8), (29, 88.1, 5)], 35: [(1, 141.0, 3), (15, 23.3, 7), (24, 94.6, 5), (26, 20.0, 6), (31, 6.1, 6), (33, 87.4, 5)] } demands_data_large = { 18: 58, 20: 38, 22: 36, 34: 22, 27: 52, 8: 35, 21: 41 } # 8 demand points priority_village_ids_large = [20, 8, 18] # 示例优先村庄 # 估算 priority_deadline (基于上述优先村庄节点1) # nodes_concrete[1]=(0,0), nodes_concrete[20]=(70,140) -> dist 156.5 # nodes_concrete[8]=(18,137) -> dist 138.2 # nodes_concrete[18]=(13,132) -> dist 132.6 # max_dist_priority = 156.5, avg_speed = 5 # priority_deadline = (156.5 / 5) * 2.5 = 31.3 * 2.5 = 78.25 # 在估算时间下采取更严格的限制 priority_deadline_large = 30.0 vehicle_props_large = [ (78, 153.4), (86, 139.2), (52, 229.5), (70, 169.8) ] # 容量个体最大行驶时间限制示例 # (容量, 个体最大行驶时间) o 重要说明: 你们将使用按上述描述生成的算例进行开发测试。最 终评价你们算法有效性时,将会使用另一个未公布的、但结构规 模与此描述类似的算例。 3. 高效启发式函数设计: o 核心任务: 基于对问题特性A*算法的理解,设计并实现至少两种 新的启发式函数。 o 目标: 这些新的启发式函数应该旨在比课程中提供的基础启发式函 数更“智能”,能够更准确地估计到达目标的剩余成本,从而引导 A*搜索更快地找到优质解,或者在相同时间内探索更少的状态。 o 要求:  清晰描述每个新启发式函数的设计思路计算方法。  如果可能,分析你的启发式函数是否是“可接受 的”(admissible),即是否会低估或等于实际的最小剩余成 本。如果不是严格可接受的,讨论其可能带来的影响。 任务与要求: 1. 代码实现: o 在你们个人作业完成的代码基础上进行修改扩展。 o 实现对“优先村庄”的处理逻辑。 o 实现你们设计的至少两种新的启发式函数。在 MultiVehiclePlanner 中可以提供一个机制来选择使用哪个启发式函数进行搜索(例如,通 过构造函数参数传递一个启发式函数名或函数本身)。 2. 实验与分析: o 使用上面提供的特定大规模算例进行开发初步测试。 o 分别使用以下启发式函数运行你们的A*算法:  课程中提供的原始(或个人作业中使用的)启发式函数。  你们设计的新的启发式函数1。  你们设计的新的启发式函数2。 o 对于每次运行,记录并比较以下性能指标:  是否找到了解决方案。  最终解的质量(例如,最慢车辆的总用时 max_time,所有车 辆的总行驶距离)。  A*算法探索的状态总数 (explored_count)。  算法的实际运行时间。 o 注意: (1)由于大规模算例的状态空间可能非常大,你们可能需 要为A*搜索设置一个合理的探索状态上限 (max_explored_limit) 或运行时间上限,以确保实验可以在可接受的时间内完成。如果达到 上限仍未找到解,也应记录此情况;(2)为了进一步起到“剪枝” 效果,必要时也可对successors方法进行改造,避免无价值状态进 入优先队列。 提交内容: 1. 一份团队Python文件 (.py): 包含所有成员贡献的、完整的、可运行的 代码。代码中应包含对优先村庄的处理逻辑所有实现的启发式函数。请 不要在提交的代码中包含用于生成上述大规模算例的脚本,直接使用提供 的数据即可。 2. 一份团队PDF格式报告(约5-10页): o **引言:**简述团队作业的目标挑战。 o 优先村庄处理: 详细说明你们是如何定义实现“优先村庄”逻辑 的,以及选择该方案的理由。 o 大规模算例说明: 简要提及你们使用了文档中提供的固定大规模算 例。 o 启发式函数设计:  对你们设计的每一种新启发式函数,详细描述其:  设计思想直觉。  具体的计算公式或算法步骤。  对其可接受性 (admissibility) 的分析或讨论。  预期的优点潜在的缺点。 o 实验设置: 描述你们的实验环境A*搜索的任何特定参数设置(如 探索上限)。 o 结果与分析:  以表格或图表形式清晰展示不同启发式函数在提供的大规模算 例上的性能指标对比结果。  深入分析讨论这些结果。例如:哪种启发式表现最好?为什 么?它们在解的质量搜索效率之间是如何权衡的?启发式函 数的计算复杂度与其带来的搜索效率提升之间有何关系? o 遇到的挑战与解决方案: 描述团队在完成作业过程中遇到的主要技 术挑战以及你们是如何克服的。 o 总结与展望: 总结你们的主要发现,并对未来可能的研究或改进方 向提出展望。 o 团队成员贡献说明: 简要说明每位团队成员在本次作业中的主要贡 献。 评分标准:  代码实现质量 (40%) o 正确且有效地实现优先村庄逻辑。 o 清晰、正确地实现至少两种新的启发式函数。 o 代码结构良好,可读性强,能够处理提供的大规模算例。  启发式函数设计与分析 (30%) o 启发式函数设计的创新性、合理性有效性。 o 对启发式函数特性(如可接受性)的分析深度。  实验结果与报告质量 (30%) o 实验设计的合理性结果呈现的清晰性。 o 对实验结果分析的深度洞察力。 o 报告的整体结构、逻辑流畅性书写规范性。 提示与建议:  分工协作: 合理分配团队任务,例如,部分成员专注于优先村庄逻辑的实 现,其他成员专注于不同启发式函数的设计与实现,共同进行测试报告撰 写。  从小处着手测试启发式: 在将新启发式应用于大规模问题之前,先在较小 规模的算例上进行测试调试。  文献参考: 可以查阅相关的车辆路径问题 (VRP) 启发式搜索的文献, 以获取设计更高级启发式函数的灵感(但需确保最终提交的是团队独立思考 实现的工作)。  代码版本控制: 建议使用Git等工具进行代码版本管理。
最新发布
06-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值