【Code Pratice】—— 递增三元组、比酒量、成绩分析

1 | 递增三元组

题目

给定三个整数数组

A = [A1, A2, ... AN],
B = [B1, B2, ... BN],
C = [C1, C2, ... CN],

请你统计有多少个三元组(i, j, k) 满足:

1 <= i, j, k <= N
Ai < Bj < Ck

输入格式
第一行包含一个整数N。
第二行包含N个整数A1, A2, … AN。
第三行包含N个整数B1, B2, … BN。
第四行包含N个整数C1, C2, … CN。

对于30%的数据,1 <= N <= 100
对于60%的数据,1 <= N <= 1000
对于100%的数据,1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000

输出格式
一个整数表示答案

例子
输入

3
1 1 1
2 2 2
3 3 3

输出
27

思路

只需要对比前后两个元素的大小关系,累加个数即可

逻辑代码

int IncTriples(int i_uNum, vector<vector<int> >& i_uArr)
{
    int res = -1;
    if (1 > i_uNum)
    {
        return res;
    }
    res = 0;

    for (int i = 0; i < i_uNum; i++)
    {
        for (int j = 0; j < i_uNum; j++)
        {
            for (int k = 0; k < i_uNum; k++)
            {
                if ((i_uArr[0][i] <= i_uArr[1][j]) && (i_uArr[1][j] <= i_uArr[2][k]))
                {
                    res++;
                }
            }
        }
    }
    return res;
}

2 | 比酒量

题目

有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的, 再次重复…
直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。
等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“…昨天,我正好喝了一瓶…奉劝大家,开船不喝酒,喝酒别开船…”

请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
如果有多个可能的答案,请列出所有答案,每个答案占一行。
格式是:人数,人数,…
例如,有一种可能是:20,5,4,2,0

思路

理解题目,得到三个关键点

  1. 不多于20人 --> 第一轮最多20人
  2. 第四瓶酒后全倒下了 --> 一共只喝了四轮
  3. 船长正好喝了一瓶,且是最后一轮倒下的 --> 四轮下来,船长分到的酒刚好一瓶

从这三个关键点,很好得出这个数学题的解题思路 —— 计算从第一轮开始,每一轮都少N个人,计算最后是否加起来的酒等于1瓶

  1. 第一轮酒最多20人
  2. 第二轮最多也比第一轮少一人
  3. 第三轮最多也比第二轮少一人
  4. 第四轮最多也比第三轮少一人
  5. 判断这四轮加起来船长分到的酒是否等于一瓶

逻辑代码

void CompareWineCapacity()
{
    for (int i = 20; i >= 4; i--)
    {
        for (int j = 4; j < i; j++)
        {
            for (int k = 3; k < j; k++)
            {
                for (int l = 2; l < k; l++)
                {
                    int Denominator = i * j * k * l;
                    int Molecular = (j * k * l) + (i * k * l) + (i * j * l) + (i * j * k);
                    if (Denominator == Molecular)
                    {
                        cout << "res = [" << i << " " << j << " " << k << " " << l << "]" << endl;
                    }
                }
            }
        }
    }
}

3 | 成绩分析

题目

小蓝给学生们组织了一场考试,卷面总分为100分,每个学生的得分都是一个0到100的整数。
请计算这次考试的最高分、最低分和平均分。

输入格式
输入的第一行包含一个整数n,表示考试人数。
接下来n行,每行包含一个0至100的整数,表示一个学生的得分。

输出格式
输出三行。
第一行包含一个整数,表示最高分。
第二行包含一个整数,表示最低分。
第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。

例子
输入

7
80
92
56
74
88
99
10

输出

99
10
71.29

思路

两个思路

  1. 先统计成绩总和,再对成绩进行排序得出最高分和最低分,再求平均分
  2. 边记录最高分最低分,边统计成绩总和,最后求平均分

逻辑代码

void LQ_Simple::PerformanceAnalysis(vector<int>& i_uArr)
{
    int len = i_uArr.size();
    if (0 == len)
    {
        cout << "Input parameter is unvalid." << endl;
        return;
    }

    int solution = 0;
    int ScoreMax = 0;
    int ScoreMin = 100;
    int ScoreSum = 0;
    float ScoreAver = 0.00;
    cout << "Please select Solutions[1, 2]: ";
    cin >> solution;
    switch (solution)
    {
        case 1:
            {
                for (int i = 0; i < len; i++)
                {
                    ScoreSum += i_uArr[i];
                }
                Sort(i_uArr);
                ScoreMax = i_uArr[0];
                ScoreMin = i_uArr[len - 1];
                ScoreAver = ((float)ScoreSum / len);
            }
            break;
        case 2:
            {
                for (int i = 0; i < len; i++)
                {
                    ScoreSum += i_uArr[i];
                    if (ScoreMax < i_uArr[i])
                    {
                        ScoreMax = i_uArr[i];
                    }
                    if (ScoreMin > i_uArr[i])
                    {
                        ScoreMin = i_uArr[i];
                    }
                }
                ScoreAver = ((float)ScoreSum / len);
            }
            break;
        
        default:
            break;
    }
    cout << "The highest score = [" << ScoreMax << "]." << endl;
    cout << "The lowest score = [" << ScoreMin << "]." << endl;
    cout << "The average score = [" << fixed << setprecision(2) <<  ScoreAver << "]." << endl;
}

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ltd Pikashu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值