LeetCode - 第208场周赛

Rank

国庆节补课,赛后补题,这周题比较简单.

A. 文件夹操作日志搜集器

简单模拟.

class Solution {
public:
    int minOperations(vector<string>& logs) {
        int n=logs.size();
        int ans=0;
        for(string log:logs){
            if(log=="./") continue;
            if(log=="../"){
                if(ans) --ans;
            }
            else{
                ++ans;
            }
        }
        return ans;
    }
};

B. 经营摩天轮的最大利润

简单模拟.

class Solution {
public:
    int minOperationsMaxProfit(vector<int>& customers, int boardingCost, int runningCost) {
        int n=customers.size();
        int ans=-1,id=0,cnt=0,i=0,cur=0,sum=0;
        while(i<n || cur>0){
            if(i<n) cur+=customers[i];//加上新来的人
            ++cnt;//轮数加1
            if(cur>=4){
                sum+=4*boardingCost-runningCost;
                cur-=4;
            }
            else{
                sum+=cur*boardingCost-runningCost;
                cur=0;
            }
            if(sum>ans){
                ans=sum;
                id=cnt;
            }
            ++i;//进入下一时刻
        }
        if(ans<0) return -1;
        return id;
    }
};

C. 皇位继承顺序

将名字字符串映射成图结点编号,按照出生关系建立一颗树,继承序列就是这个树的前序遍历序列.

class ThroneInheritance {
public:
    const static int maxn=1e5+50;
    int tot=0;
    unordered_map<string,int> getid;
    vector<string> getname;
    vector<int> g[maxn];
    bool dead[maxn];

    ThroneInheritance(string kingName) {
        getname.emplace_back("");
        getid[kingName]=++tot;
        dead[tot]=false;
        getname.emplace_back(kingName);
    }

    void birth(string parentName, string childName) {
        int u=getid[parentName];
        getid[childName]=++tot;
        int v=getid[childName];
        dead[v]=false;
        getname.push_back(childName);
        g[u].emplace_back(v);
    }

    void death(string name) {
        int u=getid[name];
        dead[u]=true;
    }

    void dfs(int u,vector<string>& res){
        if(!dead[u]) res.emplace_back(getname[u]);
        for(int v:g[u]) dfs(v,res);
    }

    vector<string> getInheritanceOrder() {
        vector<string> res;
        dfs(1,res);
        return res;
    }
};

D. 最多可达成的换楼请求数目

二进制暴力枚举每个要求满足或不满足,对于每种枚举结果判断一下是否满足要求(每个点的入度和出度相等),如果满足则更新答案的最大值.

class Solution {
public:
    int maximumRequests(int n, vector<vector<int>>& requests) {
        int d[25]={0};
        int m=requests.size();
        int ans=0;
        for(int s=0;s<(1<<m);++s){
            for(int i=0;i<n;++i) d[i]=0;
            int cnt=0;
            for(int i=0;i<m;++i){
                if(s>>i&1){
                    ++cnt;
                    ++d[requests[i][0]];
                    --d[requests[i][1]];
                }
            }
            bool ok=true;
            for(int i=0;i<n;++i){
                if(d[i]!=0){
                    ok=false;
                    break;
                }
            }
            if(ok && cnt>ans) ans=cnt;
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值