应该是csp到现在实现最容易的大模拟了,不涉及任何算法,直接按给出的过程慢慢写就行。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+5;
const int inf = 0x3f3f3f3f;
struct IP{
int time=0;//过期时间
string holder="";//掌握主机
int statu=0;//0 未分配 1 待分配 2 占用 3 过期
}ip[N];
int n,t_def,t_max,t_min;
string h;
signed main(){
ios::sync_with_stdio(0);
cin>>n>>t_def>>t_max>>t_min>>h;
int T;cin>>T;
while (T--){
int now;
string from,to,type;
int iip,time;
cin>>now>>from>>to>>type>>iip>>time;
//是否处理
//1
if(to!=h&&to!="*"){
if(type!="REQ")continue;
}
//2
if(type!="DIS"&&type!="REQ")continue;
//3
if(to=="*"&&type!="DIS")continue;
if(to==h&&type=="DIS")continue;
//更新过期状态
for(int i=1;i<=n;i++){
if(now>=ip[i].time) {
if (ip[i].statu == 1) {
ip[i].statu = 0;
ip[i].holder = "";
ip[i].time = 0;
} else if (ip[i].statu == 2) {
ip[i].statu=3;
ip[i].time=0;
}
}
}
//Discover 报文
if(type=="DIS"){
//1 检查ip地址
int to_ip=-1;
for(int i=1;i<=n;i++){
if(ip[i].holder==from){
to_ip=i;
break;
}
}
if(to_ip<0){
int min_no_ip=inf,min_over_ip=inf;
for(int i=1;i<=n;i++){
if(ip[i].statu==0)min_no_ip = min(min_no_ip,i);
else if(ip[i].statu==3)min_over_ip = min(min_over_ip,i);
}
if(min_no_ip!=inf)to_ip = min_no_ip;
else if(min_over_ip!=inf)to_ip = min_over_ip;
}
if(to_ip<0)continue;
//2
ip[to_ip].statu = 1;
ip[to_ip].holder = from;
//3
if(time==0){
ip[to_ip].time = now+t_def;
} else{
if(time>now+t_max){
ip[to_ip].time = now+t_max;
}else if(time<now+t_min){
ip[to_ip].time = now+t_min;
} else ip[to_ip].time = time;
}
//4
cout<<h<<" "<<from<<" OFR "<<to_ip<<" "<<ip[to_ip].time<<endl;
} else {
//1
if(to!=h){
for(int i=1;i<=n;i++){
if(ip[i].holder==from){
if(ip[i].statu==1){
ip[i].statu=0;
ip[i].holder="";
ip[i].time=0;
}
}
}
continue;
}
//2
if(!(iip<=n&&iip>=1&&ip[iip].holder==from)){
cout<<h<<" "<<from<<" NAK "<<iip<<" "<<0<<endl;
continue;
}
//3
ip[iip].statu = 2;
//4
if(time==0){
ip[iip].time = now+t_def;
} else{
if(time>now+t_max){
ip[iip].time = now+t_max;
}else if(time<now+t_min){
ip[iip].time = now+t_min;
} else ip[iip].time = time;
}
//5
cout<<h<<" "<<from<<" ACK "<<iip<<" "<<ip[iip].time<<endl;
}
}
}