1.解题思路
这道题只想出了暴力解法,按题意设计三种数据结构,分别是神经元node,脉冲源mai和突触tu,其中node中的edge保存了该神经元作为入节点相连的突触编号和神经元编号,mai的v保存了该脉冲源作为入节点相连的突触编号和神经元编号,时间从1到t开始遍历,对每一个时间步,首先遍历脉冲源,当其r大于myrand()时发送脉冲,从而更新相应神经元的I[t]值,其次遍历各神经元,按公式计算u和v,当v大于等于30时,更新相应神经元的I[t]值并进行发送脉冲数计数cnt,更新v和u值。然而。。。只得了66分
也尝试过优化内存和读入数据,但似乎没什么用?
还有一个一直很疑惑的点,csp官网的测试集是不是在不断加强。。。之前过的满分代码也是跑了66分。。。期待有无大佬能解决这个问题。
2.66分代码
#include<iostream>
#include<vector>
#include<utility>
using namespace std;
const int N=1e3+1;
const int T=1e5+1;
struct node{
double v0,v1;
double u0,u1;
double a,b,c,d;
int cnt;
double I[T];
vector<pair<int,int>>edge;
}node[N];
struct tu{
double w;
int D;
}a[N];
struct mai{
int r;
vector<pair<int,int>>v;
}b[N];
static unsigned long nex=1;
int myrand(void)
{
nex=nex*1103515245+12345;
return ((unsigned)(nex/65536)%32768);
}
int main()
{
int n,s,p,t;
double t1;
scanf("%d%d%d%d",&n,&s,&p,&t);
scanf("%lf",&t1);
int index=0;
while(index<n)
{
int rn;
double u,v,a,b,c,d;
scanf("%d%lf%lf%lf%lf%lf%lf",&rn,&v,&u,&a,&b,&c,&d);
for(int i=0;i<rn;i++)
node[index+i].a=a,node[index+i].b=b,node[index+i].c=c,node[index+i].d=d,node[index+i].v0=v,node[index+i].u0=u;
index+=rn;
}
for(int i=0;i<p;i++)
{
scanf("%d",&b[i].r);
}
for(int i=0;i<s;i++)
{
int st,ed;
scanf("%d%d%lf%d",&st,&ed,&a[i].w,&a[i].D);
if(st>=n)
{
b[st-n].v.push_back(make_pair(i,ed));
}
else
node[st].edge.push_back(make_pair(i,ed));
}
for(int i=1;i<=t;i++)
{
for(int j=0;j<p;j++)
{
if(b[j].r>myrand())
{
for(auto it:b[j].v)
{
node[it.second].I[i+a[it.first].D]+=a[it.first].w;
}
}
}
for(int j=0;j<n;j++)
{
node[j].v1=node[j].v0+t1*(0.04*node[j].v0*node[j].v0+5*node[j].v0+140-node[j].u0)+node[j].I[i];
node[j].u1=node[j].u0+t1*node[j].a*(node[j].b*node[j].v0-node[j].u0);
if(node[j].v1>=30)
{
for(auto it:node[j].edge)
{
node[it.second].I[i+a[it.first].D]+=a[it.first].w;
}
node[j].v1=node[j].c;
node[j].u1=node[j].u1+node[j].d;
node[j].cnt++;
}
node[j].u0=node[j].u1;
node[j].v0=node[j].v1;
}
}
int cntmin=node[0].cnt,cntmax=node[0].cnt;
double vmin=node[0].v1,vmax=node[0].v1;
for(int i=1;i<n;i++)
{
if(node[i].cnt<cntmin)cntmin=node[i].cnt;
if(node[i].cnt>cntmax)cntmax=node[i].cnt;
if(node[i].v1<vmin)vmin=node[i].v1;
if(node[i].v1>vmax)vmax=node[i].v1;
}
printf("%.3lf %.3lf\n",vmin,vmax);
printf("%d %d\n",cntmin,cntmax);
return 0;
}