力扣 第 316 场周赛 ---代码记录

本文探讨了如何使用Solution类实现事件冲突判断与最大公因数子数组计数,涉及时间区间比较、线段树数据结构和最优化问题求解。通过实例展示了Solution类的haveConflict方法、线段树查询和最小成本数组调整算法。
摘要由CSDN通过智能技术生成

T1 判断两个事件是否存在冲突

class Solution {
public:
    bool haveConflict(vector<string>& a, vector<string>& b) {
        int h1 = stoi(a[0].substr(0,2));
        int m1 = stoi(a[0].substr(3,2));
        
        int h2 = stoi(a[1].substr(0,2));
        int m2 = stoi(a[1].substr(3,2));
        
        int h3 = stoi(b[0].substr(0,2));
        int m3 = stoi(b[0].substr(3,2));
        
        int h4 = stoi(b[1].substr(0,2));
        int m4 = stoi(b[1].substr(3,2));
        
        int t1 = h1 * 60 + m1;
        int t2 = h2 * 60 + m2;
        int t3 = h3 * 60 + m3;
        int t4 = h4 * 60 + m4;
        if(t1 == t3 || t1 == t4 || t2 == t3 || t2 == t4) return true;
        if(t1 < t3 && t2 > t3) return true;
        if(t3 < t1 && t4 > t1) return true;
        return false;
    }
};

T2 最大公因数等于 K 的子数组数目— 线段树

class Solution {
public:

    int n;
    int w[1010];
    struct node
    {
        int l,r;
        int gcd;
    }tr[4010];

    void pushup(int u)
    {
        tr[u].gcd = __gcd(tr[u << 1].gcd, tr[u << 1 | 1].gcd);
    }

    void build(int u,int l,int r)
    {
        if(l == r) tr[u] = {l, r, w[l]};
        else
        {
            tr[u] = {l,r};
            int mid = l + r >> 1;
            build(u << 1, l, mid);
            build(u << 1 | 1, mid + 1, r);
            pushup(u);
        }
    }

    int query(int u,int l,int r)
    {
        if(tr[u].l >= l && tr[u].r <= r) return tr[u].gcd;
        else
        {
            int mid = tr[u].l + tr[u].r >> 1;
            if(r <= mid) return query(u << 1, l, r);
            if(l > mid) return query(u << 1 | 1, l, r);
            return __gcd(query(u << 1, l, r), query(u << 1 | 1, l, r));
        }
    }
    
    int subarrayGCD(vector<int>& a, int k) {
        n = a.size();
        for(int i = 0; i < n; i ++) w[i + 1] = a[i];
        build(1, 1, n);
        int res = 0;
        
        for(int i = 1; i <= n; i ++)
            for(int j = i; j <= n; j ++)
            {
                if(__gcd(w[i], w[j]) < k) continue;
                if(query(1, i, j) == k) res ++;
            }
        return res;
    }
};

T3 使数组相等的最小开销 — 数学 + 思维

typedef long long LL;
class Solution {
public:
    long long minCost(vector<int>& nums, vector<int>& cost) 
    {
        vector<pair<int,int>> vec;
        int n = nums.size();        
        for(int i = 0; i < n; i ++) vec.push_back({nums[i], cost[i]});
        sort(vec.begin(), vec.end());
        
        LL cost1 = 0, cost2 = 0;
        for(auto x : cost) cost2 += x;
        LL s1 = 0, s2 = 0;
        for(int i = 0; i < n; i ++) s2 += (LL)nums[i] * cost[i];
        
        LL res = s2, pre = 0;
        for(int i = 0; i < n; i ++)
        {
            LL x = vec[i].first, y = vec[i].second;
            s2 -= (LL)cost2 * (x - pre);
            s1 += (LL)cost1 * (x - pre);
            res = min(s1 + s2, res);
            
            pre = x;
            cost1 += y; 
            cost2 -= y;
        }
        return res;
    }
};

T4 使数组相似的最少操作次数 — 贪心

typedef long long LL;
class Solution {
public:
    long long makeSimilar(vector<int>& a, vector<int>& b) {
        int n = a.size();
        
        vector<int> vec1[2], vec2[2];
        for(int i = 0; i < n; i ++)
        {
            vec1[a[i] % 2].push_back(a[i]);
            vec2[b[i] % 2].push_back(b[i]);
        }
        
        sort(vec1[0].begin(),vec1[0].end());
        sort(vec1[1].begin(),vec1[1].end());
        sort(vec2[0].begin(),vec2[0].end());
        sort(vec2[1].begin(),vec2[1].end());
        
        LL res = 0;
        
        int m1 = vec1[0].size(), m2 = vec1[1].size();
        for(int i = 0; i < m1; i ++) res += abs(vec1[0][i] - vec2[0][i]);
        for(int i = 0; i < m2; i ++) res += abs(vec1[1][i] - vec2[1][i]);
        
        return res / 4;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_WAWA鱼_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值