【算法集训暑期刷题营】7.6题---贪心

算法集训传送门

  👉引言

在这里插入图片描述

铭记于心
🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉

💖 ❄️我们的算法之路❄️💖

   众所周知,作为一名合格的程序员,算法 能力 是不可获缺的,并且在算法学习的过程中我们总是能感受到算法的✨魅力✨。
              ☀️🌟短短几行代码,凝聚无数前人智慧;一个普通循环,即是解题之眼🌟☀️
   💝二分,💝贪心,💝并查集,💝二叉树,💝图论,💝深度优先搜索(dfs),💝宽度优先搜索(bfs),💝数论,💝动态规划等等, 路漫漫其修远兮,吾将上下而求索! 希望在此集训中与大家共同进步,有所收获!!!🎉🎉🎉

在这里插入图片描述


今日主题:贪心


 👉⭐️第一题💎

   ✨题目

      1.分发饼干
在这里插入图片描述

   ✨思路

排序+贪心

   ✨代码
class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(), g.end());
        sort(s.begin(), s.end());
        int num = g.size(), numO = s.size();
        int count = 0;
        for (int i = 0, j = 0; i < num && j < numO; i++, j++) {
            while (j < numO && g[i] > s[j]) {
                j++;
            }
            if (j < numO) {
                count++;
            }
        }
        return count;
    }
};


在这里插入图片描述

 👉⭐️第二题💎

   ✨题目

      2.心算挑战
在这里插入图片描述

先从大到小进行排序后取前cnt个数累加,如果和使偶数则直接返回,若是奇数,则从最小的数开始减,贪心思想

   ✨代码
class Solution {
public:
    int maxmiumScore(vector<int>& cards, int cnt) {
        sort(cards.begin(), cards.end(), greater<int>());
        int res = 0, lastodd = 0, lasteven = 0;
        for (int i = 0; i < cnt; i++)
        {
            res += cards[i];
            if (cards[i] % 2 == 1) lastodd = cards[i];
            else lasteven = cards[i];
        }
        if (res % 2 == 0) return res;

        int max1 = 0, max2 = 0;
        for (int i = cnt; i < cards.size(); i++)
        {
            if (lasteven && max1 == 0 && cards[i]%2) max1 = res - lasteven + cards[i];
            if (lastodd && max2 == 0 && cards[i]%2 == 0) max2 = res - lastodd + cards[i];
        }
        return max(max1, max2);
    }
};


在这里插入图片描述

 👉⭐️第三题💎

   ✨题目

      3.保持城市天际线
在这里插入图片描述

   ✨代码
class Solution {
public:
    int maxIncreaseKeepingSkyline(vector<vector<int>>& grid) {
        int n = grid.size();
        vector<int> rowMax(n);
        vector<int> colMax(n);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                rowMax[i] = max(rowMax[i], grid[i][j]);
                colMax[j] = max(colMax[j], grid[i][j]);
            }
        }
        int ans = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                ans += min(rowMax[i], colMax[j]) - grid[i][j];
            }
        }
        return ans;
    }
};


在这里插入图片描述

 👉⭐️第四题💎

   ✨题目

      4.Shoe Shuffling
在这里插入图片描述

有一个班的同学厌倦了每天穿自己的鞋子,他们决定换鞋穿,一双鞋是不可分割的,被看成一个对象。这个班有n个学生,给你一个非递减顺序的数组s(可以理解成升序),si是第i个学生的鞋码,只有当每个学生得到的鞋子不属于自己并且得到的鞋子的尺码必须大于等于自己的尺码时,这样的交换才是有效的。(就是每个人不能拿自己的鞋并且拿到的鞋不能小于自己的脚)。如果存在合法方案请打印一种,不存在则输出-1

   ✨代码
#include <bits/stdc++.h>

using namespace std;

#define ll long long
typedef vector<ll> vll;
#define io                            \
    ios_base::sync_with_stdio(false); \
    cin.tie(NULL);                    \
    cout.tie(NULL)

int main()
{
    io;
    ll tc;
    cin >> tc;
    while (tc--)
    {
        ll n;
        cin >> n;
        vll s(n), p(n);
        for (ll i = 0; i < n; ++i)
            cin >> s[i];

        ll l = 0, r = 0;
        bool ans = true;
        for (ll i = 0; i < n; ++i)
            p[i] = i + 1;

        while (r < n)
        {
            while (r < n - 1 and s[r] == s[r + 1]) // get range [l,r] with equal values
                ++r;
            if (l == r)
                ans = false;
            else
                rotate(p.begin() + l, p.begin() + r, p.begin() + r + 1); // rotate right in range [l,r]
            l = r + 1;
            ++r;
        }
        if (ans)
        {
            for (auto &x : p)
                cout << x << " ";
            cout << endl;
        }
        else
            cout << -1 << endl;
    }
    return 0;
}

写在最后
相信大家对今天的集训内容的理解与以往已经有很大不同了吧,或许也感受到了算法的魅力,当然这是一定的,路漫漫其修远兮,吾将上下而求索!伙伴们,明天见!在这里插入图片描述

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦想new的出来

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

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

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

打赏作者

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

抵扣说明:

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

余额充值