ccf-csp认证 202104.3 dhcp服务器

应该是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;
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值