原题链接:CCF-CSP 202109-3 脉冲神经网络
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6e026aca9f6c0166d918fd0ef56da4e1.png)
#include <bits/stdc++.h>
using namespace std;
#define ll unsigned long long
const int N=1010;
static unsigned long nnext = 1;
int myrand(void) {
nnext = nnext * 1103515245 + 12345;
return((unsigned)(nnext/65536) % 32768);
}
struct Node
{
double v,u,a,b,c,d;
int num;
int r;
}node[2010];
double Ik[N][N];
int mod=0;
struct tuchu
{
int t,D;
double w;
tuchu(int _t,double _w,int _D):t(_t),w(_w),D(_D) {}
};
vector<tuchu> g[2010];
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int N,S,P,T;
cin>>N>>S>>P>>T;
int NP=N,SP=S,PP=P;
double dt; cin>>dt;
int cur=0;
while(N>0)
{
int RN;
double v,u,a,b,c,d;
cin>>RN;
cin>>v>>u>>a>>b>>c>>d;
for(int i=cur;i<cur+RN;i++)
{
node[i].v=v;
node[i].u=u;
node[i].a=a;
node[i].b=b;
node[i].c=c;
node[i].d=d;
}
cur+=RN;
N-=RN;
}
N=NP;
while(P--)
{
int r; cin>>r;
node[cur].r=r;
cur++;
}
P=PP;
while(S--)
{
int s,t,D;
double w;
cin>>s>>t>>w>>D;
g[s].push_back(tuchu(t,w,D));
mod=max(mod,D+1);
}
S=SP;
int f=0;
for(int ttmp=1;ttmp<=T;ttmp++)
{
if(ttmp==T) f=1;
int tt=ttmp%mod;
for(int now=N;now<N+P;now++)
{
int my=myrand();
if(node[now].r>my)
{
for(int i=0;i<g[now].size();i++)
{
int to=g[now][i].t;
double w=g[now][i].w;
int D=g[now][i].D;
Ik[(tt+D)%mod][to]+=w;
}
}
}
for(int now=0;now<N;now++)
{
double vv=node[now].v;
double uu=node[now].u;
double a=node[now].a;
double b=node[now].b;
node[now].v=vv+dt*(0.04*vv*vv+5*vv+140-uu)+Ik[tt][now];
node[now].u=uu+dt*a*(b*vv-uu);
if(node[now].v>=30)
{
node[now].v=node[now].c;
node[now].u+=node[now].d;
node[now].num++;
for(int i=0;i<g[now].size();i++)
{
int to=g[now][i].t;
double w=g[now][i].w;
int D=g[now][i].D;
Ik[(tt+D)%mod][to]+=w;
}
}
}
for(int i=0;i<1010;i++) Ik[tt][i]=0;
}
double maxv=node[0].v,minv=node[0].v;
int maxnum=node[0].num,minnum=node[0].num;
for(int i=1;i<N;i++)
{
maxv=max(node[i].v,maxv);
minv=min(node[i].v,minv);
maxnum=max(node[i].num,maxnum);
minnum=min(node[i].num,minnum);
}
cout<<setiosflags(ios::fixed)<<setprecision(3)<<minv<<" "<<maxv<<endl;
cout<<minnum<<" "<<maxnum<<endl;
return 0;
}