文章目录
- 第一题:最佳圆柱体直径
- 题目描述
- 输入格式
- 输出格式
- 输入样例
- 输出样例
- 解题思路&C++题解
- 第二题:贪心国王
- 题目描述
- 输入格式
- 输出格式
- 数据范围
- 输入样例
- 输出样例
- 解题思路&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;
}