CSP刷题0916

今天在宿舍窝着,啊好水哦,没干什么

早上解决了之前遗留的 “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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值