BestCoder Round #86 HDU 5804,HDU 5805,HDU 5806,HDU 5807

第一题: HDU 5804 链接

0 ~ 商品总和之间的任意价格都可以取到 每次判断记录是否大于总和即可

代码:

#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
#define sf scanf
#define pf printf
using namespace std;
typedef long long LL;

int main(){
    int T,n,m;
    LL temp,sum;
    sf("%d",&T);
    while( T-- ){
        sum = 0;
        sf("%d %d",&n,&m);
        for(int i = 0;i < n;++i){
            sf("%I64d",&temp);
            sum += temp;
        }
        for(int i = 0;i < m;++i){
            sf("%I64d",&temp);
            if(temp > sum){
                pf("1");
            }else pf("0");
        }
        pf("\n");
    }
    return 0;
}

第二题: HDU 5805 链接

记录前缀和后缀最大值f,g 枚举所有去掉点 求左端点 的 前缀最大值 、右端点后缀最大值,左右端点距离 的MAX 求和即可

long long 没注意 被hack了
然后hack我的人 我已经关注你了!

代码:

#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
#define sf scanf
#define pf printf
#define fabs(n) ((n) > 0 ? n : -(n))
using namespace std;
typedef long long LL;
const int maxn = 100000 + 5;
int A[maxn];
int pre_max[maxn];
int tail_max[maxn];
int main(){
    int T;
    sf("%d",&T);
    while( T-- ){
        int n;sf("%d",&n);
        for(int i = 0;i < n;++i){
            sf("%d",&A[i]);
        }
        pre_max[0] = 0;
        for(int i = 1;i < n;++i){
            pre_max[i] = max(pre_max[i - 1],fabs(A[i - 1] - A[i]));
        }

        tail_max[n - 1] = 0;
        for(int i = n - 2;i >= 0;--i){
            tail_max[i] = max(tail_max[i + 1],fabs(A[i + 1] - A[i]));
        }
        LL ans = 0;
        for(int i = 1;i < n - 1;++i){
            ans += max(pre_max[i - 1],max( tail_max[i + 1] ,fabs(A[i - 1] - A[i + 1])) );
        }
        ans += tail_max[1] + pre_max[n - 2];
        pf("%I64d\n",ans);
    }
    return 0;
}

第三题: HDU 5806 链接

和题解的比起来我的有些复杂
枚举区间坐端点 之后二分查找合法的最左右端点p
∑(n - p + 1)就是答案了

代码:

#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
#define sf scanf
#define pf printf
using namespace std;
const int maxn = 200000 + 5;
int sum[maxn];
typedef long long LL;
int main(){
//    freopen("read.txt","r",stdin);
    int T;
    sf("%d",&T);
    int n,k,m;
    while( T-- ){
        sf("%d%d%d",&n,&m,&k);
        for(int i = 1;i <= n;++i){
            sf("%d",&sum[0]);
            if(sum[0] >= m){
                sum[i] = 1;
            }else sum[i] = 0;
        }

        sum[0] = 0;
        for(int i = 1;i <= n;++i){
            sum[i] = sum[i - 1] + sum[i];
        }
//        for(int i = 1;i <= n;++i) pf("%d\n",sum[i]);
        LL ans = 0;
        for(int i = 1;i <= n;++i){
//            pf("aa");
            int p = lower_bound(sum + 1,sum + n + 1,sum[i - 1] + k) - sum;
            ans += n - p + 1;
        }
        pf("%I64d\n",ans);
    }
    return 0;
}

第四题:HDU 5807 链接

简单的DAG图 初始化将两个城市不能通信的状态值 设为0
dp[i][j][k] = ∑dp[a][b][c]
加了一个状态p表示此时是第几个人移动到 0表示3人都移动完成 加快的算法速度

代码:

#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
#define sf scanf
#define pf printf
using namespace std;
int fabs(int n){
    return n > 0 ? n : -n;
}
typedef long long LL;
const int maxn = 51;
const LL mod = 998244353;
LL dp[maxn][maxn][maxn][4];
int kk[maxn];
vector<int> Adj[maxn];
LL get_next_point(int a,int b,int c,int lable){
    LL &ans = dp[a][b][c][lable];
    if(ans != -1) return ans;
    ans = 0;
    if(lable == 0){
        ans = 1;
        ans += get_next_point(a,b,c,1);
        ans %= mod;
//        pf("%d %d %d %lld\n",a,b,c,ans);
        return ans;
    }
    if(lable == 1){
        for(int i = 0;i < Adj[a].size();++i){
            ans += get_next_point(Adj[a][i],b,c,2);
            ans %= mod;
        }
    }
    if(lable == 2){
        for(int i = 0;i < Adj[b].size();++i){
            ans += get_next_point(a,Adj[b][i],c,3);
            ans %= mod;
        }
    }
    if(lable == 3){
        for(int i = 0;i < Adj[c].size();++i){
            ans += get_next_point(a,b,Adj[c][i],0);
            ans %= mod;
        }
    }
    return ans;
}


void init(){
    for(int i = 0;i < maxn;++i){
        Adj[i].clear();
    }
}

int main(){
//    freopen("read.txt","r",stdin);
    int T;
    int n,m,k,q;
    sf("%d",&T);
    while( T-- ){
        init();
        sf("%d%d%d%d",&n,&m,&k,&q);

        for(int i = 1;i <= n;++i){
            sf("%d",&kk[i]);
        }
        for(int i = 0;i < m;++i){
            int u,v;sf("%d%d",&u,&v);
            Adj[u].push_back(v);
        }

        memset(dp,-1,sizeof(dp));
        for(int i = 1;i <= n;++i){
            for(int j = 1;j <= n;++j){
                if(fabs( kk[i] - kk[j] ) > k){
//                    pf("%d %d\n",i,j);
                    for(int p = 1;p <= n;++p){
                        dp[i][j][p][0] =  dp[i][p][j][0] = dp[p][i][j][0] = 0;
                    }
                }
            }
        }
        for(int i = 0;i < q;++i){
            int a,b,c;
            sf("%d%d%d",&a,&b,&c);
            printf("%lld\n",get_next_point(a,b,c,0));
        }
    }
    return 0;
}
内容概要:本文介绍了一个基于冠豪猪优化算法(CPO)的无人机三维路径规划项目,利用Python实现了在复杂三维环境中为无人机规划安全、高效、低能耗飞行路径的完整解决方案。项目涵盖空间环境建模、无人机动力学约束、路径编码、多目标代价函数设计以及CPO算法的核心实现。通过体素网格建模、动态障碍物处理、路径平滑技术和多约束融合机制,系统能够在高维、密集障碍环境下快速搜索出满足飞行可行性、安全性与能效最优的路径,并支持在线重规划以适应动态环境变化。文中还提供了关键模块的代码示例,包括环境建模、路径评估和CPO优化流程。; 适合人群:具备一定Python编程基础和优化算法基础知识,从事无人机、智能机器人、路径规划或智能优化算法研究的相关科研人员与工程技术人员,尤其适合研究生及有一定工作经验的研发工程师。; 使用场景及目标:①应用于复杂三维环境下的无人机自主导航与避障;②研究智能优化算法(如CPO)在路径规划中的实际部署与性能优化;③实现多目标(路径最短、能耗最低、安全性最高)耦合条件下的工程化路径求解;④构建可扩展的智能无人系统决策框架。; 阅读建议:建议结合文中模型架构与代码示例进行实践运行,重点关注目标函数设计、CPO算法改进策略与约束处理机制,宜在仿真环境中测试不同场景以深入理解算法行为与系统鲁棒性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值