神经元与脉冲源是节点,突触是边,按题意模拟即可。
突触传递脉冲有一个时间D的延迟,开一个 a d d [ 1005 ] [ 1005 ] add[1005][1005] add[1005][1005] 数组来记录不同时刻脉冲到达的强度。如果延迟最大是 D m a x D_{max} Dmax,那只要记录当前时刻往后 D m a x D_{max} Dmax 时刻内的变化就行,对 D m a x + 1 D_{max}+1 Dmax+1 取模以节约空间(类似循环队列)。
把传递脉冲封装成函数,TLE。
所有时刻对1001取模,TLE。
最后卡着时限过去了(
#include
using namespace std;
#define chkmax(a,b) a=max(a,b)
#define chkmin(a,b) a=min(a,b)
static unsigned long Next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void)
{
Next = Next * 1103515245 + 12345;
return((unsigned)(Next/65536) % 32768);
}
struct edge {
int to;
double w;
int D;
};
vector<edge> G[2005];
double v[1005],u[1005];
double a[1005],b[1005],c[1005],d[1005];
double add[1005][1005]= {0};
double delt;
int r[2005];
int cnt[1005]= {0};
int T,N,S,P,t,mod=0;
int main ()
{
scanf("%d%d%d%d",&N,&S,&P,&T);
scanf("%lf",&delt);
int now=0,rn;
double tv,tu,ta,tb,tc,td;
while(now<N) {
scanf("%d%lf%lf%lf%lf%lf%lf",&rn,&tv,&tu,&ta,&tb,&tc,&td);
for(int i=0; i<rn; i++) {
v[now]=tv,u[now]=tu,a[now]=ta,b[now]=tb,c[now]=tc;
d[now++]=td;
}
}
while(now<N+P)
scanf("%d",&r[now++]);
int s,to,D;
double w;
for(int i=0; i<S; i++) {
scanf("%d%d%lf%d",&s,&to,&w,&D);
G[s].push_back({to,w,D});
chkmax(mod,D);
}
mod++;
for(t=1; t<=T; t++) {
for(int i=0; i<N; i++) {
double I=add[i][t%mod];
add[i][t%mod]=0;
double up=u[i],vp=v[i];
v[i]=vp+delt*((0.04*vp+5)*vp+140-up)+I;
u[i]=up+delt*a[i]*(b[i]*vp-up);
if(v[i]>=30) {
cnt[i]++;
for(int j=0; j<G[i].size(); j++) {
edge e=G[i][j];
add[e.to][(t+e.D)%mod]+=e.w;
}
v[i]=c[i];
u[i]+=d[i];
}
}
for(int i=N; i<N+P; i++)
if(r[i]>myrand())
for(int j=0; j<G[i].size(); j++) {
edge e=G[i][j];
add[e.to][(t+e.D)%mod]+=e.w;
}
}
int mint=99999999,maxt=0;
double minv=9999999,maxv=-9999999;
for(int i=0; i<N; i++) {
chkmin(minv,v[i]);
chkmax(maxv,v[i]);
chkmax(maxt,cnt[i]);
chkmin(mint,cnt[i]);
}
printf("%.3lf %.3lf\n",minv,maxv);
printf("%d %d\n",mint,maxt);
}