今天在宿舍窝着,啊好水哦,没干什么
早上解决了之前遗留的 “URLy映射”那题
晚上写完计网作业,就在玩了
剩下时间写这题,看题目就花了快一小时,或者更多,中途去洗澡洗头了
202104-3 DHPC服务器
第一遍提交 50分
改了很多遍后 60分
呜呜呜,好累,我还是先睡觉算了,起床再改
时间坐标,0917,终于改好了
原来题目很多细节看错了!!!啊啊啊好粗心啊!!
这道题真的简单!!!
希望考试时一切顺利,拥有敏锐观察力和思考力…
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
const int M=10010;
int N,n,td,tmax,tmin;
string H;
struct node{
int state;//0未分配,1待分配,2占用,3过期
long long tdef;//过期时刻
string occupy;//占用者
}P[M];
bool check(string receive,string type){
//处理细节3
if(receive=="*"&&type!="DIS") return false;
if(receive==H&&type!="REQ") return false;
//处理细节2
if(type!="DIS"&&type!="REQ") return false;
//处理细节1
if(receive!="*"&&receive!=H&&type!="REQ") return false;
return true;
}
void update(long long now){
for(int i=0;i<N;i++){
if(P[i].tdef<=now){//如果过期
if(P[i].state==2){//占用的变为已过期
P[i].state=3;
// P[i].tdef=0;
}else if(P[i].state==1){//待分配的变为未分配
P[i].state=0;
P[i].occupy.clear();
P[i].tdef=0;
}
}
}
}
void discover(long long now,string send,long long tdef){
int flag=0,index;
for(int i=0;i<N&&!flag;i++){//检查是否有占用者为send的ip
if(P[i].occupy==send){
index=i;
P[i].state=1;
flag=1;
}
}
for(int i=0;i<N&&!flag;i++){//寻找最小的状态为未分配的地址
if(P[i].state==0){
P[i].state=1;
index=i;
flag=1;
}
}
for(int i=0;i<N&&!flag;i++){//寻找最小的状态为已过期的地址
if(P[i].state==3){
P[i].state=1;
index=i;
flag=1;
}
}
if(flag){
P[index].occupy=send;//更新占用者和过期时间
if(tdef==0) P[index].tdef=(now+td);
else if(tdef<(now+tmin)) P[index].tdef=(now+tmin);
else if(tdef>(now+tmax)) P[index].tdef=(now+tmax);
else P[index].tdef=tdef;
cout<<H<<' '<<send<<" OFR "<<index+1<<' '<<P[index].tdef<<endl;
}
}
void request(long long now,string send,string receive,long long ip,long long tdef){
if(receive==H){//接收主机为本机
if(ip>N){
cout<<H<<' '<<send<<" NAK "<<ip<<' '<<0<<endl;
return ;
}
int i=ip-1;
if(P[i].occupy==send){
P[i].state=2;
if(tdef==0) P[i].tdef=(now+td);
else if(tdef<(now+tmin)) P[i].tdef=(now+tmin);
else if(tdef>(now+tmax)) P[i].tdef=(now+tmax);
else P[i].tdef=tdef;
cout<<H<<' '<<send<<" ACK "<<ip<<' '<<P[i].tdef<<endl;
}
else cout<<H<<' '<<send<<" NAK "<<ip<<' '<<0<<endl;
}else{//接收主机不为本机
for(int i=0;i<N;i++){
//状态待分配
if(P[i].occupy==send&&P[i].state==1){
P[i].state=0;
P[i].occupy.clear();
P[i].tdef=0;
}
}
}
}
int main(){
cin>>N>>td>>tmax>>tmin>>H;
cin>>n;
long long t,ip,tdef;
string send,receive,type;
for(int i=0;i<n;i++){
cin>>t>>send>>receive>>type>>ip>>tdef;
update(t);
if(check(receive,type)){
if(type=="DIS") discover(t,send,tdef);
else request(t,send,receive,ip,tdef);
}else continue;
}
system("pause");
return 0;
}