【有料c++题目周刊 | 第三期】复兴时代

第一题:最佳圆柱体直径

题目描述

在复兴时期,一位富有的商人拥有许多宝贵的珠宝,他想要在他的商店里展示这些珠宝。为了使展示效果更好,他决定使用一种特殊的摆放方式,使得商店里的每一颗珠宝都能够被最多的人看到。


在这里插入图片描述


商人的商店是一个矩形,他想要在商店中心放置一个圆柱体,使得这个圆柱体能够完全包含所有的珠宝。

给定商店的长度 L L L(单位:米)、宽度 W W W(单位:米)以及圆柱体的高度 H H H(单位:米),你需要编写一个程序来计算出最大的圆柱体直径 D D D(单位:米),使得这个圆柱体能够完全包含所有的珠宝。

输入格式

输入的第一行包含三个整数 L L L W W W H H H,表示商店的长度、宽度和圆柱体的高度。

输出格式

输出一个数字,表示最大的圆柱体直径 D D D。答案保留小数点后 2 位。

输入样例

5 6 7

输出样例

5.00

解题思路&C++题解

思路:

在解决本题时,我们需要考虑以下几点:

圆柱体的直径是一个可变的参数,我们需要枚举不同的直径值来找到最优解。
圆柱体的高度是一个已知的参数,我们需要使用它来计算圆柱体的体积。
商店的长度和宽度也是已知的参数,我们需要使用它们来计算圆柱体的最大直径。
算法流程:

读入商店的长度 L L L、宽度 W W W 和圆柱体的高度 H H H

设置一个变量 m a x D maxD maxD 表示目前找到的最大的圆柱体直径,初始化为 0。

设置一个变量 D D D 表示当前枚举的圆柱体直径,从 0 开始枚举。

计算圆柱体的体积 V V V

如果圆柱体的体积 V V V 大于等于商店的长度 L L L 和宽度 W W W 的乘积,则将 m a x D maxD maxD 更新为当前的圆柱体直径 D D D

D D D 增加 0.01,重复步骤 4 和 5。

输出 m a x D maxD maxD

注意:

  • 在计算圆柱体体积时,要将圆柱体直径除以 2 得到圆柱体的半径,然后再使用公式计算圆柱体的体积。

  • 在输出答案时,要使用 printf 函数,并且要保留两位小数。

C++ 代码如下:

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int L, W, H;
    cin >> L >> W >> H;

    double maxD = 0; // 记录找到的最大的圆柱体直径
    double D = 0; // 当前枚举的圆柱体直径
    while (D <= min(L, W))
    {
        // 计算圆柱体的体积
        double r = D / 2; // 圆柱体的半径
        double V = 3.14 * r * r * H; // 圆柱体的体积

        if (V >= L * W) // 圆柱体的体积大于等于商店的长宽乘积
        {
            maxD = D;
        }

        D += 0.01;
    }

    printf("%.2lf\n", maxD);

    return 0;
}

第二题:贪心国王

题目描述

在英国的复兴时代,有一位国王统治着整个国家。这位国王非常贪心,他希望尽可能多地收集财富,但同时他也要考虑国内的经济和政治情况。


在这里插入图片描述


作为国王的贤辅,你被要求设计一个程序来帮助国王做出最优的决策。具体来说,你需要设计一个程序,根据国王的资源情况和政治局势,为国王提供一系列的财富增长策略。

国王有两种资源可供使用:金子和石头。金子可以通过掠夺、贸易或探索新地区来获得,而石头则可以通过掠夺、采矿或向其他国家购买来获得。

你的程序需要根据国王所拥有的金子和石头的数量,以及国王的政治局势(也就是国王周围的国家的势力),为国王提供最优的财富增长策略。

具体来说,你的程序需要实现以下功能:

  • 根据国王的资源情况和政治局势,计算出国王每一种财富增长策略的收益。
  • 根据收益的大小,为国王排序各种财富增长策略。

输入格式

第一行包含三个整数n、m、k,分别表示国王所拥有的金子数量、石头数量和周围国家的势力。

第二行包含五个整数a1、a2、a3、b1、b2,分别表示掠夺、贸易和探索新地区三种获得金子的方式的收益和消耗。具体来说,a1表示掠夺获得的金子数量,a2表示贸易获得的金子数量,a3表示探索新地区获得的金子数量,b1表示掠夺消耗的石头数量,b2表示贸易消耗的石头数量。

第三行包含三个整数c1、c2、c3,分别表示掠夺、采矿和购买三种获得石头的方式的收益和消耗。具体来说,c1表示掠夺获得的石头数量,c2表示采矿获得的石头数量,c3表示购买获得的石头数量。

输出格式

输出六行,每行一种财富增长策略。每行输出两个数字,分别表示这种策略的收益和消耗。按照收益从大到小的顺序输出。

数据范围

1≤n,m,k≤109,
−109≤a1,a2,a3,b1,b2,c1,c2,c3≤109

输入样例

10 20 30
30 20 10 3 2
20 10 5

输出样例

30 3
20 2
10 0
20 10
10 5
10 0

解题思路&C++题解

思路:

由于题目中给出的数据范围,我们可以直接用一个数组来存储每一种财富增长策略的收益和消耗,然后再将这个数组按照收益从大到小排序,最后直接输出即可。

C++代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 6;

struct Node{
    int s, e;
}a[N];

bool cmp(Node a, Node b)
{
    return a.s > b.s;
}

int main()
{
    int n, m, k;
    scanf("%d%d%d", &n, &m, &k);
    scanf("%d%d%d%d%d", &a[0].s, &a[1].s, &a[2].s, &a[0].e, &a[1].e);
    scanf("%d%d%d", &a[3].e, &a[4].e, &a[5].e);
    a[3].s = a[4].s = a[5].s = 0;
    sort(a, a + N, cmp);

    for (int i = 0; i < N; i ++ ) printf("%d %d\n", a[i].s, a[i].e);

    return 0;
}

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

[root@小刘较瘦~]#

打赏即动力,打赏即鼓励。

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

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

打赏作者

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

抵扣说明:

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

余额充值