一、题目链接
二、题目分析
(一)算法标签
大模拟 邻接表
(二)解题思路
三、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;
}