CSP20210403-DHCP服务器
满分AC
#include"stdio.h"
#include"iostream"
#include"vector"
#include"string.h"
using namespace std;
class A{
public:
int state;
char own[21];
long long dl;
A(){
own[0]=0;
state=0;
dl=0;
}
};
long long N,Tdef,Tmax,Tmin;
char H[21],s1[21],s2[21];
long long t,a,b;
A Aa[10001];
long long caltime(){
if(b==0){
return t+Tdef;
}
if(b>=t+Tmin&&b<=t+Tmax){
return b;
}
if(b<Tmin+t){
return t+Tmin;
}
if(b>Tmax+t){
return t+Tmax;
}
return t+Tdef;
}
void D(){
if(s2[0]=='*'&&s2[1]==0){
int flag=0;
int flag1=0;
int flag2=0;
for(int i=1;i<=N;i++){
if(Aa[i].state!=0){
if(strcmp(Aa[i].own,s1)==0){
flag=i;
break;
}
}
}
if(flag==0){
for(int i=1;i<=N;i++){
if(Aa[i].state==0){
flag1=i;
break;
}
}
if(flag1==0){
for(int i=1;i<=N;i++){
if(Aa[i].state==3){
flag2=i;
break;
}
}
if(flag2!=0){
strcpy(Aa[flag2].own,s1);
long long t1=caltime();
Aa[flag2].state=1;
Aa[flag2].dl=t1;
printf("%s %s OFR %d %lld\n",H,s1,flag2,t1);
}
}
else{
strcpy(Aa[flag1].own,s1);
long long t1=caltime();
Aa[flag1].state=1;
Aa[flag1].dl=t1;
printf("%s %s OFR %d %lld\n",H,s1,flag1,t1);
}
}
else{
long long t1=caltime();
Aa[flag].state=1;
Aa[flag].dl=t1;
printf("%s %s OFR %d %lld\n",H,s1,flag,t1);
}
}
}
void R(){
if(strcmp(s2,H)==0){
int flag=0;
if(a<=N&&a>=1){
if(Aa[a].state!=0){
if(strcmp(Aa[a].own,s1)==0){
flag=1;
}
}
if(flag==1){
Aa[a].state=2;
long long t1=caltime();
Aa[a].dl=t1;
printf("%s %s ACK %lld %lld\n",H,s1,a,t1);
}
}
if(flag==0){
printf("%s %s NAK %lld 0\n",H,s1,a);
}
}
else{
if(s2[0]=='*'&&s2[1]==0){
return;
}
for(int i=1;i<=N;i++){
if(strcmp(Aa[i].own,s1)==0){
if(Aa[i].state==1){
Aa[i].state=0;
Aa[i].own[0]=0;
Aa[i].dl=0;
}
}
}
}
}
void update(){
for(int i=1;i<=N;i++){
if(Aa[i].state!=0&&Aa[i].state!=3){
if(Aa[i].dl<=t){
switch(Aa[i].state){
case 1:
Aa[i].state=0;
Aa[i].own[0]=0;
break;
case 2:
Aa[i].state=3;
break;
default:
break;
}
Aa[i].dl=0;
}
}
}
}
int main(){
scanf("%lld%lld%lld%lld%s",&N,&Tdef,&Tmax,&Tmin,H);
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
char s3[5];
scanf("%lld%s%s%s%lld%lld",&t,s1,s2,s3,&a,&b);
update();
switch(s3[0]){
case 'D':
D();
break;
case 'R':
R();
break;
default:
break;
}
}
return 0;
}