检查了很多遍都觉得没有问题,不知道为什么提交到官网就WA了
#include <iostream>
#include <cstring>
#include <stdio.h>
using namespace std;
const int MAXN = 2e3 + 10,M = 2010;
int N,S,P,T;
double dt;
int rn;
double v1,u1,a1,b1,c1,d1;
int h[MAXN],e[MAXN],ne[MAXN],idx;
int s,t,D[MAXN];
double w[MAXN];
double w1;
int D1;
int Ik[MAXN][M]; // 每个时刻的脉冲加上每个神经元的
struct NERU{
int id;
double v,u,a,b,c,d;
int times;
}ner[MAXN];
struct MAI{
int id;
int r;
}mai[MAXN];
static unsigned long nexts = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
nexts = nexts * 1103515245 + 12345;
return((unsigned)(nexts/65536) % 32768);
}
void add(int a, int b,double w1,int D1)
{
e[idx] = b, w[idx] = w1,D[idx] = D1; ne[idx] = h[a], h[a] = idx ++ ;
}
int main()
{
cin >> N >> S >> P >> T;
cin >> dt;
for(int i=0;i < N;i++) // shuru shenjingy
{
cin >> rn >> v1 >> u1 >> a1 >> b1 >> c1 >> d1;
while(rn--)
{
ner[i].id = i;
ner[i].v = v1;
ner[i].u = u1;
ner[i].a = a1;
ner[i].b = b1;
ner[i].c = c1;
ner[i].d = d1;
if(rn != 0) i++;
}
}
for(int i=N;i < P + N;i++)
{
cin >> mai[i].r;
mai[i].id = i;
}
memset(h, -1, sizeof h);
for(int i=0;i < S;i++)
{
cin >> s >> t >> w1 >> D1;
add(s,t,w1,D1);
}
for(int t=1;t <= T;t++)
{
// 对于每个脉冲源 ,再从突触里面找到对应的 ,是不是忽视了神经元发出的东西
for(int j=N;j < P + N;j++)
{
int aa = myrand();
// cout << aa << endl;
if(mai[j].r > aa) // 发送突触
{
for (int ii = h[mai[j].id]; ii != -1; ii = ne[ii])
{
int jj = e[ii];
double ww = w[ii];
int DD = D[ii];
Ik[t+DD][jj] += ww;
}
}
}
for(int j=0;j < N;j++) // shenjingyuan gengxin
{
double vv = ner[j].v,uu = ner[j].u; // 一开始没有考虑先后顺序,发现必须要记录下这个值,但是又写惯了int,所以算不对
ner[j].v = vv + dt*(0.04*vv*vv + 5*vv + 140 - uu) + Ik[t][j];
ner[j].u = uu + dt*ner[j].a*(ner[j].b*vv - uu);
if(ner[j].v >= 30.00)
{
ner[j].times++;
for (int ii = h[ner[j].id]; ii != -1; ii = ne[ii])
{
int jj = e[ii];
double ww = w[ii]; // 这里又写成了int
int DD = D[ii];
Ik[t+DD][jj] += ww;
}
ner[j].v = ner[j].c;
ner[j].u += ner[j].d;
}
// cout << ner[j].v << endl;
}
}
double min_v = ner[0].v,max_v = ner[0].v;
int min_t = ner[0].times,max_t = ner[0].times;
for(int j=0;j < N;j++)
{
// printf("%lf\n", ner[j].v);
min_v = min(ner[j].v,min_v);
max_v = max(ner[j].v,max_v);
min_t = min(ner[j].times,min_t);
max_t = max(ner[j].times,max_t);
}
// cout << min_v << " " << max_v << endl;
printf("%.3f %.3f\n",min_v,max_v);
printf("%.d %.d\n",min_t,max_t);
// cout << min_t << " " << max_t ;
return 0;
}