硬模拟就a了
AC代码
#include<iostream>
#include<cstdio>
#include<string>
#include<fstream>
using namespace std;
int N,tdef,tmax,tmin;
string H,host,receive,typ;
int ip;
const int maxn=1e4+10;
struct IP
{
int status;
string zhanyong;
int tim;
}all[maxn];
int main()
{
cin>>N>>tdef>>tmax>>tmin>>H;
for(int i=1;i<=N;i++)
{
all[i].status=0;
all[i].zhanyong="";
all[i].tim=0;
}
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int t,exceed;
cin>>t>>host>>receive>>typ>>ip>>exceed;
for(int j=1;j<=N;j++)
{
if(t>=all[j].tim&&all[j].tim>0)
{
if(all[j].status==1)
{
all[j].status=0;
all[j].zhanyong="";
all[j].tim=0;
}
else {
all[j].status=3;
all[j].tim=0;
}
}
}
if(H==receive||receive=="*")
{
if(typ!="REQ"&&typ!="DIS")
{
continue;
}
if(receive=="*"&&(!(typ=="DIS")))
{
continue;
}
if(receive==H&&typ=="DIS")
{
continue;
}
}
else if(!(typ=="REQ"))
continue;
if(typ=="DIS")
{
int tri=0;
int pick;
for(int j=1;j<=N;j++)
{
if(all[j].zhanyong==host)
{
pick=j;
tri++;
break;
}
}
if(!tri)
{
for(int j=1;j<=N;j++)
{
if(all[j].status==0)
{
pick=j;
tri++;
break;
}
}
if(!tri)
{
for(int j=1;j<=N;j++)
{
if(all[j].status==3)
{
pick=j;
tri++;
break;
}
}
if(!tri)
{
continue;
}
}
}
all[pick].status=1;
all[pick].zhanyong=host;
if(exceed==0)
{
all[pick].tim=t+tdef;
}
else
{
all[pick].tim=exceed;
if(exceed-t>tmax)
all[pick].tim=t+tmax;
if(exceed-t<tmin)
all[pick].tim=t+tmin;
}
cout<<H<<" "<<host<<" OFR "<<pick<<" "<<all[pick].tim<<"\n";
}
if(typ=="REQ")
{
if(receive!=H)
{
for(int j=1;j<=N;j++)
{
if(all[j].zhanyong==host)
{
if(all[j].status==1)
{
all[j].status=0;
all[j].zhanyong="";
all[j].tim=0;
}
}
}
continue;
}
if(ip>=1&&ip<=N&&all[ip].zhanyong==host)
{
all[ip].status=2;
if(exceed==0)
{
all[ip].tim=t+tdef;
}
else
{
all[ip].tim=exceed;
if(exceed-t>tmax)
all[ip].tim=t+tmax;
if(exceed-t<tmin)
all[ip].tim=t+tmin;
}
cout<<H<<" "<<host<<" ACK "<<ip<<" "<<all[ip].tim<<"\n";
}
else{
cout<<H<<" "<<host<<" NAK "<<ip<<" 0\n";
}
}
}
}