202104 CSP认证 | DHCP服务器

3. DHCP服务器

我天呢经历了带配额的文件系统我真的极其挫败,然后开始写的时候觉得这个题感觉怎么有点简单...然后就觉得肯定是自己有很多东西没有想到,而且写的时候破罐子破摔觉得肯定会超时...

结果一写!哦买噶居然满分了!

脑子不清醒的时候写的差不多也就两个小时不到吧,天哪第三题要是是这种难度也太幸福了orz

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 +10;
string H;
ll M, Tdef, Tmax, Tmin;
map<string, set<ll> > user_ip;

struct Ip{   //定义一个IP结构体
    int status = 1; //1表示未分配,2表示待分配,3表示占用,4表示过期
    string user = "";
    ll ddl = 0;
};
Ip ipPool[N];  //定义一个IP池

bool compare(string a, string b)
{
    if(a.size() != b.size()) return false;
    for(int i = 0;i < a.size();i ++){
        if(a[i] != b[i])
            return false;
    }
    return true;
}
//在每个时刻前进行检查
void check(ll t)
{
    for(ll i = 1;i <= M;i ++){
        if(ipPool[i].ddl && t >= ipPool[i].ddl){
            if(ipPool[i].status == 2){   //待分配状态
                ipPool[i].status = 1;
                string user = ipPool[i].user;
                ipPool[i].user = "";
                ipPool[i].ddl = 0;

                user_ip[user].erase(i);
                if(!user_ip[user].size())
                    user_ip.erase(user);
            }
            else if(ipPool[i].status == 3){  //占用变为过期
                ipPool[i].status = 4;
                ipPool[i].ddl = 0;
            }
        }
    }
}
void Discover(const ll t,const string from,const string to,const ll ddl)
{
    ll id; bool flag = false;
    if(to != "*")  return;

    if(user_ip.count(from)){
        id = *user_ip[from].begin();  //取出第一个
        flag = true;
    }
    else {
        for(ll i = 1;i <= M ;i ++){
            if(ipPool[i].status == 1){
                id = i;
                flag = true;
                break;
            }
        }
        for(ll i = 1;i <= M && !flag;i ++){
            if(ipPool[i].status == 4){
                id = i;
                string user = ipPool[i].user;
                user_ip[user].erase(i);
                if(!user_ip[user].size()) user_ip.erase(user);
                flag = true;
                break;
            }
        }
    }
    if(!flag) return;
    ipPool[id].status = 2;
    ipPool[id].user = from;
    user_ip[from].insert(id);

    ll overtime;
    if(!ddl) overtime = t + Tdef;
    else{
        if(ddl - t >= Tmin && ddl - t <= Tmax) overtime = ddl;
        else if(ddl - t > Tmax) overtime = t + Tmax;
        else overtime = t + Tmin;
    }
    ipPool[id].ddl = overtime;
    cout << H <<' '<<from<<' '<<"OFR "<<id<<' '<<overtime<<"\n";
}

void Request(const ll t,const string from,const string to,const ll ip,const ll ddl)
{
    if(to == "*") return;
    if(!compare(to, H)){
        auto temp = user_ip[from];
        for(auto x : temp){
            if(ipPool[x].status == 2){
                ipPool[x].status = 1;
                ipPool[x].user = "";
                ipPool[x].ddl = 0;
                user_ip[from].erase(x);
            }
        }
        if(!user_ip[from].size()) user_ip.erase(from);
        return;
    }
    if(ip >= 1 && ip <= M && compare(ipPool[ip].user, from)){
        ipPool[ip].status = 3;
        ll overtime;
        if(!ddl) overtime = t + Tdef;
        else{
            if(ddl - t >= Tmin && ddl - t <= Tmax) overtime = ddl;
            else if(ddl - t > Tmax) overtime = t + Tmax;
            else overtime = t + Tmin;
        }
        ipPool[ip].ddl = overtime;
        cout << H <<' '<<from<<' '<<"ACK "<<ip<<' '<<overtime<<"\n";
    }else{  //发送Nak报文
        cout << H <<' '<<from<<' '<<"NAK "<<ip<<' '<<0<<"\n";
    }
}
int main()
{
    ll n;
    cin >> M >> Tdef >> Tmax >> Tmin >> H;
    cin >> n;
    for(ll i = 1;i <= M;i ++){
        ipPool[i].status = 1;
        ipPool[i].ddl = 0;
        ipPool[i].user = "";
    }

    while(n --){
        ll t, ip ,ddl;
        string from, to , type;
        cin >> t >> from >> to >> type >> ip >> ddl;
        check(t);
        if(type == "DIS"){
            Discover(t,from,to,ddl);
        }else if(type == "REQ"){
            Request(t, from, to, ip, ddl);
        }
    }
    return 0;
}

当你感觉第三题写不下去了就来写DHCP服务器吧!!

相关推荐
2301_7779983431 分钟前
Linux线程同步与互斥(三):信号量与环形队列实现生产者消费者模型
linux·c语言·c++
啦啦啦啦啦zzzz32 分钟前
设计模式:单例模式和工厂模式
c++·单例模式·设计模式·工厂模式
Henry Zhu12336 分钟前
C++ 动态多态详解
c++
此生决int41 分钟前
深入理解C++系列(06)——模版初阶与STL
开发语言·c++
c238561 小时前
《枚举算法 “翻译官”:用 enum class 给 “游游的礼盒” 算分》
c语言·c++·算法
noipp1 小时前
推荐题目:洛谷 P5843 [SCOI2012] Blinker 的噩梦
c语言·数据结构·c++·算法·游戏·洛谷·luogu
鱼子星_2 小时前
《算 · 法》题目解析篇(1):最近公共祖先问题,线段树,最长回文子序列
c++·算法·动态规划·递归
计算机内卷的N天3 小时前
CMake与Visual Studio的使用
c++·ide·visual studio
汉克老师3 小时前
GESP2026年3月认证C++七级( 第三部分编程题(1、物流网络))精讲
c++·最短路·gesp7级
鱼子星_4 小时前
【C++】深入剖析list:list及其双向迭代器实现
开发语言·数据结构·c++·笔记·stl·list