第23次CCF CSP认证 202109-3非脉冲神经网络


一、题目链接

第23次CCF CSP认证 202109-3非脉冲神经网络


二、题目分析

(一)算法标签

大模拟 邻接表

(二)解题思路


三、AC代码

解法一:

#include <iostream>
#include <cstring>

using namespace std;

const int MAX = 2010;
const double INF = 1e8;

int N, S, P, T;
double dt;
double v[MAX], u[MAX], a[MAX], b[MAX], c[MAX], d[MAX], w[MAX];
int r[MAX];
int s[MAX], t[MAX], D[MAX];
double I[1024][MAX / 2];
int cnt[MAX];

int h[MAX], e[MAX], ne[MAX], idx;

void add(int a, int b, double ww, int DD)
{
    e[idx] = b, w[idx] = ww, D[idx] = DD, ne[idx] = h[a], h[a] = idx ++ ;
}

static unsigned long next1 = 1;

/* RAND_MAX assumed to be 32767 */
int my_rand() {
    next1 = next1 * 1103515245 + 12345;
    return((unsigned)(next1/65536) % 32768);
}


int main()
{
    // scanf("%d%d%d%d", &N, &S, &P, &T);
    // scanf("%lf", &dt);
    cin >> N >> S >> P >> T >> dt;

    memset(h, -1, sizeof h);

    for (int i = 0; i < N; )
    {
        int rn;
        double vv, uu, aa, bb, cc, dd;
        cin >> rn >> vv >> uu >> aa >> bb >> cc >> dd;
        // scanf("%d%lf%lf%lf%lf%lf%lf", &rn, &vv, &uu, &aa, &bb, &cc, &dd);
        for (int j = 0; j < rn; j ++ , i ++ )
        {
            v[i] = vv, u[i] = uu, a[i] = aa, b[i] = bb, c[i] = cc, d[i] = dd;
        }
    }

    for (int i = N; i < N + P; i ++ ) cin >> r[i];

    int mod = 0;
    for (int i = 0; i < S; i ++ )
    {
        int ss, tt, DD;
        double ww;
        cin >> ss >> tt >> ww >> DD;
        // scanf("%d%d%lf%d", &ss, &tt, &ww, &DD);
        add(ss, tt, ww, DD);
        mod = max(mod, DD + 1); //  t ~ t + D 有 D + 1 个
    }

    for (int i = 0; i < T; i ++ )
    {
        int tt = i % mod;
        // 脉冲
        for (int j = N; j < N + P; j ++ )
        {
            if (r[j] > my_rand())
            {
                for (int k = h[j]; ~k; k = ne[k])
                {
                    int va = e[k];
                    I[(tt + D[k]) % mod][va] += w[k];
                }
            }
        }
        // 神经元
        for (int j = 0; j < N; j ++ )
        {
            double vv = v[j], uu = u[j];
            v[j] = vv + dt * (0.04 * vv * vv + 5 * vv + 140 - uu) + I[tt][j];
            u[j] = uu + dt * a[j] * (b[j] * vv - uu);

            if (v[j] >= 30)
            {
                for (int k = h[j]; ~k; k = ne[k])
                {
                    int va = e[k];
                    I[(tt + D[k]) % mod][va] += w[k];
                }
                cnt[j] ++ ;
                v[j] = c[j];
                u[j] += d[j];
            }
        }
        memset(I[tt], 0, sizeof I[tt]);
    }
    int minc = INF, maxc = -INF;
    double minv = INF, maxv = -INF;
    for (int i = 0; i < N; i ++ )
    {
        minv = min(minv, v[i]);
        maxv = max(maxv, v[i]);
        minc = min(minc, cnt[i]);
        maxc = max(maxc, cnt[i]);
    }

    printf("%.3lf %.3lf\n", minv, maxv);
    printf("%d %d\n", minc, maxc);
    return 0;
}

四、其它题解

第23次CCF CSP认证 202109-3非脉冲神经网络

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值