River Jumping【贪心+模拟】

题目链接


  我们可以贪心的从前往后,每次选最接近的且满足条件的这样的贪心,然后从后往前的时候,就是直接用倒着一个个判断是否合法即可。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 1e5 + 7;
int N, M, S, a[maxN], col[maxN];
set<int> st;
set<int>::iterator it;
vector<int> ans;
int main()
{
    scanf("%d%d%d", &N, &M, &S);
    for(int i=1; i<=M; i++) { scanf("%d", &a[i]); col[a[i]] = i; }
    a[++M] = N; a[0] = 0; col[N] = M; col[0] = 0;
    for(int i=0; i<=M; i++) st.insert(a[i]);
    bool ok = true; int pos = 0;
    while(ok && pos ^ N)
    {
        it = st.lower_bound(pos + S);
        if(it == st.end()) { ok = false; break; }
        pos = *it;
        ans.push_back(col[pos]);
        st.erase(it);
    }
    int nex_pos;
    while(!st.empty())
    {
        nex_pos = *st.rbegin();
        if(pos - nex_pos < S) { ok = false; break; }
        ans.push_back(col[nex_pos]);
        pos = nex_pos;
        st.erase(nex_pos);
    }
    if(pos) ok = false;
    int len = (int)ans.size();
    if(ok && len == M + 1)
    {
        printf("YES\n");
        for(int i=0; i<len; i++) printf("%d%c", ans[i], i == len - 1 ? '\n' : ' ');
    }
    else printf("NO\n");
    return 0;
}

 

马尔科夫跳跃神经网络(Markovian Jumping Neural Networks, MJNNs)是一种结合了马尔科夫过程和人工神经网络的技术,常用于处理具有随机状态切换的数据,如时间序列预测和模式识别等。在MATLAB中,有许多库和工具箱可以支持MJNN的开发,如Neural Network Toolbox。 以下是一个简单的MATLAB代码示例,展示如何创建一个基本的马尔科夫跳跃神经网络模型: ```matlab % 导入所需库 addpath('toolbox/MJNetToolbox') % 假设MJNetToolbox已经安装 % 创建神经网络结构 numInputs = 10; % 输入特征数 hiddenNodes = [5, 3]; % 隐藏层节点数 numOutputs = 1; % 输出节点数 net = newMJNetwork(numInputs, hiddenNodes, numOutputs); % 设置马尔可夫转移矩阵和初始状态分布 T = randi([1, 3], 3, 3); % 生成一个3x3的随机马尔可夫矩阵,表示状态之间的概率转移 pi = ones(1, 3) / 3; % 初始状态均匀分布 % 训练网络 inputs = ... % 输入数据 targets = ... % 目标数据 net = train(net, inputs, targets, 'TransitionMatrix', T, 'InitialStateDistribution', pi); % 测试网络 testInputs = ... % 测试数据 outputs = predict(net, testInputs); ``` 请注意,这只是一个非常基础的框架,并未包括完整的训练循环和评估步骤。实际使用中,你需要提供适当的数据、调整网络参数并可能利用一些优化技术。此外,`newMJNetwork`, `train`, 和 `predict` 这些函数在真实环境中需要替换为对应的MJNetToolbox函数或自定义函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wuliwuliii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值