Codeforces Problemset 30D(#30 div.1 D)

本文探讨了一种算法解决方案,用于解决在特定点集合中找到最短路径的问题,涉及了三角形不等式原理、分段路径组合及最优路径选择策略。详细介绍了算法的实现步骤、关键逻辑和优化策略,旨在提供一种高效解决实际路径问题的方法。

【题目大意】

有n个点在x轴上,第n+1个点可能在任意的地方,问从k号点出发最短遍历需要走多远

【输入】

第一行两个数字n、k,意义如题目所示

接下来一行n+1个数字,分别表示n+1个点的x坐标

之后一行一个数字表示第n+1号点的y坐标


首先考虑k=n+1的时候

根据三角形不等式,肯定是走到一个x轴上最左或最右的点,然后直着走


当起点在x轴上的时候

有两种情况

一种是走到一头然后再调头走到另外一头然后走向n+1号点

另外一种是从某个点i分开,

然后变成这个样子

1----i-----i+1----k-----n

这种先走向i+1或者n,然后再调头,走向n+1,再走向1或者i之后走向i或者1

或者

1----k-----i-----i+1----n

这种类似……


#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int n,k,i,j,x[100001],s[100001],dl[100001],a,b;
double ans;

double dis(double x1,double y1,double x2,double y2)
{
       return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

bool cmp(int a,int b)
{
     return x[a]<x[b];
}

double quicku(double s,double e)
{
       return e-s+min(dis(a,b,s,0),dis(a,b,e,0));
}

double quickd(double s,double m,double e)
{
       return min(
                  m+e-2*s+dis(a,b,e,0),
                  2*e-s-m+dis(a,b,s,0));
}

int main()
{
    scanf("%d%d",&n,&k);
    for (i=1;i<=n;i++) scanf("%d",&x[i]);
    scanf("%d%d",&a,&b);
    for (i=1;i<=n;i++) dl[i]=i;
    sort(dl+1,dl+1+n,cmp);
    if (k==n+1)
    {
       printf("%.10f\n",x[dl[n]]-x[dl[1]]+min(dis(a,b,x[dl[n]],0),dis(a,b,x[dl[1]],0)));
       return 0;
    }
    for (i=1;i<=n;i++)
        if (dl[i]==k) 
        {
           k=i;
           break;
        }
    for (i=1;i<=n;i++) s[i]=x[dl[i]];
    ans=(s[n]-s[k])*2+s[k]-s[1]+dis(a,b,s[1],0);
    ans=min(ans,s[n]-s[1]+s[k]-s[1]+dis(a,b,s[n],0));
    for (i=2;i<=k;i++)
        ans=min(ans,quicku(s[1],s[i-1])+quickd(s[i],s[k],s[n]));
    for (i=k;i<n;i++)
        ans=min(ans,quickd(s[1],s[k],s[i])+quicku(s[i+1],s[n]));
    printf("%.10f\n",ans);
    cin.get();
    cin.get();
    return 0;
}


内容概要:本文介绍了基于贝叶斯优化的CNN-LSTM混合神经网络在时间序列预测中的应用,并提供了完整的Matlab代码实现。该模型结合了卷积神经网络(CNN)在特征提取方面的优势与长短期记忆网络(LSTM)在处理时序依赖问题上的强大能力,形成一种高效的混合预测架构。通过贝叶斯优化算法自动调参,提升了模型的预测精度与泛化能力,适用于风电、光伏、负荷、交通流等多种复杂非线性系统的预测任务。文中还展示了模型训练流程、参数优化机制及实际预测效果分析,突出其在科研与工程应用中的实用性。; 适合人群:具备一定机器学习基基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)础和Matlab编程经验的高校研究生、科研人员及从事预测建模的工程技术人员,尤其适合关注深度学习与智能优化算法结合应用的研究者。; 使用场景及目标:①解决各类时间序列预测问题,如能源出力预测、电力负荷预测、环境数据预测等;②学习如何将CNN-LSTM模型与贝叶斯优化相结合,提升模型性能;③掌握Matlab环境下深度学习模型搭建与超参数自动优化的技术路线。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注贝叶斯优化模块与混合神经网络结构的设计逻辑,通过调整数据集和参数加深对模型工作机制的理解,同时可将其框架迁移至其他预测场景中验证效果。
### Codeforces Educational Round 168 Div. 2 Problem D 解析 #### 题目概述 题目描述涉及给定一个长度为 n 的数组 a 和整数 k,目标是在不超过 k 次操作的情况下使数组中的所有元素相等。每次操作可以选择任意数量的元素并将其增加或减少 1。 为了实现这一目标,需要找到一种策略来最小化所需的操作次数,使得最终所有的数组元素都相同[^1]。 #### 关键思路 核心在于理解到最优解通常是将所有元素变为中位数值。这是因为对于任何一组数字来说,调整至中位数所需的总移动量是最少的。具体而言: - 如果 n 是奇数,则存在唯一的中间值作为最佳目标; - 若 n 为偶数,则两个可能的目标分别是位于中心位置相邻的一对平均值之一; 考虑到最多可以执行 k 次修改动作,在某些情况下即使不是严格意义上的“中位数”,也可以通过适当选取接近它的其他值达到目的,只要满足条件即可。 #### 实现方法 以下是解决该问题的一种算法框架: ```cpp #include <bits/stdc++..h> using namespace std; int main() { int t; cin >> t; while (t--) { long long n, k; cin >> n >> k; vector<long long> a(n); for(auto &i : a) cin >> i; sort(a.begin(), a.end()); map<int,int> m; // 记录每个差异数出现频率 for(int i=0; i<n-1; ++i){ if(abs(a[i]-a[i+1])!=0)m[abs(a[i]-a[i+1])]++; } auto it=m.rbegin(); bool flag=true; while(k && !m.empty()){ if(it->second<=k){ k-=it->second; m.erase((++it).base()); }else{ cout << "NO\n"; flag=false;break; } it=m.rbegin(); } if(flag || m.size()==0)cout<<"YES\n"; } } ``` 此代码片段实现了上述逻辑的一部分,即尝试尽可能多地消除差异最大的一对元素之间的差距直到无法继续为止。需要注意的是这段代码并不完全适用于所有情况下的直接提交测试,而是提供了一个基本的方向指引。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值