力扣第76场双周赛

第一题:找到最接近0的数字

思路:用一个数表示到0之间的距离

代码:

class Solution {
public:
    int findClosestNumber(vector<int>& nums) {
        int res = -1e7, m = 1e7; //res为数字,m为到0的距离
        for(int i : nums){
            if(fabs(i) < m){
                m = fabs(i);
                res = i;
            }
            else if(fabs(i) == m)
                res = max(res, i);
        }
        return res;
    }
};

 第二题:买钢笔和铅笔的方案数

思路:暴力模拟

代码:

class Solution {
public:
    long long waysToBuyPensPencils(int total, int cost1, int cost2) {
        long long res = 0;
        for(int i = 0; i * cost1 <= total; i ++){
            int j = (total - i * cost1) / cost2;
            res += j + 1;
        }
        return res;
    }
};

 第三题:设计一个ATM机器

思路:用数组来实现,一个数组来表示钱的数额,一个表示每一个数额有的的数量,一个数组来代表数额的数量进行操作,还有一个数组来表示被取掉的每一个数额的数量,第三个数组我原本是想在函数中定义的但是超内存了,还有一个坑就是表示每一个数额有的数量会爆int

代码:

class ATM {
public:
    vector<long long> ans, temp;
    vector<int> cnt;
    vector<int> m = {20, 50, 100, 200, 500};
    ATM() {
        ans.resize(5);
    }
    
    void deposit(vector<int> banknotesCount) {
        for(int i = 0; i < 5; i ++)  ans[i] += banknotesCount[i];
    }
    
    vector<int> withdraw(int amount) {
        temp = ans;
        cnt.resize(5);
        for(int i = 0; i < 5; i ++) cnt[i] = 0;
        for(int i = 4; i >= 0; i--){
            if(amount >= m[i]){
                int ct = amount / m[i];
                if(ct >= temp[i]){
                    amount -= temp[i] * m[i];
                    cnt[i] = temp[i];
                    temp[i] = 0;
                }
                else{
                    amount -= ct * m[i];
                    cnt[i] = ct;
                    temp[i] -= ct;
                }
            } 
        }
        
        if(amount)  return {-1};
        ans = temp;
        return cnt;
    }
};

/**
 * Your ATM object will be instantiated and called as such:
 * ATM* obj = new ATM();
 * obj->deposit(banknotesCount);
 * vector<int> param_2 = obj->withdraw(amount);
 */

第4题:节点序列的最大得分

思路:从中间的边开始向两边枚举,例如a-x-y-b以x和y两个点为主整体在x和y相邻的点开始枚举找到最大值

代码:

class Solution {
public:
    int maximumScore(vector<int>& scores, vector<vector<int>>& edges) {
        int n = scores.size();
        vector< vector< pair<int, int> >>   ans(n); //ans存储每个点相邻的点和其权值和
        //读取
        for(auto i : edges){
            int x = i[0], y = i[1];
            ans[x].push_back({scores[y], y});
            ans[y].push_back({scores[x], x});
        } 
        //当长度等于3时只能去前3个,为了防止超时,注意要加&因为对数组进行了修改
        for(auto &i : ans){
            if(i.size() > 3)
            {
                sort(i.begin(), i.end(), [](const pair<int, int> &a, const pair<int, int> &b){    return a.first > b.first; });
                i.resize(3);
            }
        }
        int res = -1;
        //从中间开向两边枚举
        for(auto i : edges){
            int x = i[0], y = i[1];
            for(auto i : ans[x]){
                for(auto j : ans[y]){
                    if(i.second != y && i.second != j.second && j.second != x)
                        res = max(res, scores[x] + scores[y] + i.first + j.first);
                }
            }
        }
        return res;
    }
};

总结:其实我认为这次的周赛还是挺简单的(前三题),但是因为第三题没有仔细看题目,导致我写了很久,以后一定要先把题目看三遍再开始写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值