【C++】刷题强训(day14)--乒乓球匡、组队竞赛、删除相邻数字的最大分数

目录

1、乒乓球匡

1.1题目

[1.2 思路](#1.2 思路)

[1.3 代码实现](#1.3 代码实现)

2、组队竞赛

[2.1 题目](#2.1 题目)

[2.2 思路](#2.2 思路)

[2.3 代码实现](#2.3 代码实现)

3、删除相邻数字的最大分数

[3.2 思路](#3.2 思路)

[3.3 代码实现](#3.3 代码实现)


刷题汇总:传送门!

1、乒乓球匡

1.1题目

1.2 思路

这道题注意一下示例,<br/>其实是换行,只是示例没有很好的展示出来

根据题目知道,需要判定A、B两盒乒乓球中,A是否包含了B中所有类型的乒乓球,其中类型以大写字母表示。如果B盒中所有球的类型在A中都有,并且每种球的数量都不大于A,则输出"Yes";否则输出"No"即可。其实就是判断B是否是A的子集,那么用哈希表统计即可。

1)、利用哈希映射,统计A字符串中字符的频次;

(2)、再遍历利用哈希,减去B字符串出现的字符;

(3)、最后再次利用哈希查询数目是否满足题目要求,即查看哈希表中B中对应字符下标的数量是否小于0,小于说明,A中对应B的字符数量不足或者不存在B的字符。否则,输出"yes".

1.3 代码实现

cpp 复制代码
#include <iostream>
using namespace std;

int main()
{
    string A, B;
    while (cin >> A >> B)
    {
        int hash[26] = { 0 };
        for (auto ch1 : A)
        {
            hash[ch1 - 'A']++;
        }
        int flag = 1;
        for (auto ch2 : B)
        {
            if (--hash[ch2 - 'A'] < 0)
            {
                flag = 0;
                break;
            }
        }
        cout << (flag ? "Yes" : "No") << endl;
    }
    return 0;
}

2、组队竞赛

2.1 题目

2.2 思路

读完题,知道让实现所有比赛组合的水平值最大,其中,每个队伍的水平值有该队伍第二高的选手水平值决定。那么,思路想到贪心法,尽可能让每个队伍都分到的第二高水平值的选手水平值高且接近,那么我们可以将每个选手的水平值进行sort排序,如5,2,8,5,1,5 排序后得到此时组队要水平值和最大,就把最大值放一组的最后,次大值作为该组第二个位置,再次大值作为第二组最大值,再将下一个值作为第二组的第二个位置,这样组成才是最大水平的和,所以最后我们就只需要拿去每一组第二个位置的值即可。

2.3 代码实现

cpp 复制代码
#include <iostream>
#include<algorithm>
using namespace std;
const int N = 1e5+10;
int n;
long long arr[N*3];
int main() 
{
    cin >> n;
    for(int i = 0;i < 3*n;i++) cin >> arr[i];
    sort(arr,arr+n*3);
    int index = n*3 - 2,count = 1;
    long long ret = 0;
    while(count++ <= n)
    {
        ret += arr[index];
        index -= 2;
    }
    cout << ret <<endl;

    return 0;
}

3、删除相邻数字的最大分数

3.2 思路

3.3 代码实现

cpp 复制代码
#include <iostream>
using namespace std;

const int N = 1e4 + 10;

int hashcount[N] = { 0 };

int f[N];
int g[N];

int main()
{
    int n;
    cin >> n;
    int a = 0;
    for(int i = 0;i < n;i++)
    {
        cin >> a;
        hashcount[a] += a;//统计a元素的分值和
    }
    //遍历哈希表
    f[0] = g[0] = 0;
    for(int i = 1;i < N;i++)
    {
        f[i] = hashcount[i] + g[i-1];
        g[i] = max(f[i-1],g[i-1]);
    }
    //输出这两种情况的最大值即可
    cout << max(f[N-1],g[N-1]) << endl;
    return 0;
}

本篇完,下篇见!

相关推荐
科研前沿2 分钟前
镜像视界浙江科技有限公司的关键技术突破有哪些?
大数据·人工智能·科技·算法·音视频·空间计算
爱码小白5 分钟前
Python 异常处理 完整学习笔记
开发语言·python
嫩萝卜头儿11 分钟前
2 - 复杂度收尾 + 链表经典OJ
数据结构·算法·链表·复杂度
c++之路20 分钟前
C++20概述
java·开发语言·c++20
星马梦缘23 分钟前
算法设计与分析 作业二 答案与解析
算法·图论·dfs·bfs·floyd-warshall·bellman_ford·多源最短路
玛丽莲茼蒿24 分钟前
Leetcode hot100 每日温度【中等】
算法·leetcode·职场和发展
cjp56032 分钟前
009.UG二次开发,任务环境草图优化3(高级功能生成直线)
算法
芝士就是力量啊 ೄ೨34 分钟前
Python如何编写一个简单的类
开发语言·python
样例过了就是过了43 分钟前
LeetCode热题100 分割等和子集
数据结构·c++·算法·leetcode·动态规划
逻辑驱动的ken1 小时前
Java高频面试考点18
java·开发语言·数据库·算法·面试·职场和发展·哈希算法