2080.夹角有多大II
题目描述
Problem - 2080
运行代码
#include <iostream>
#include <math.h>
using namespace std;
int main() {int T;double x1, y1, x2, y2;double res;scanf_s("%d", &T);while (T--) {scanf_s("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);//利用向量的夹角公式,并且用acos(-1)代替π res = (x1 * x2 + y1 * y2) / (sqrt(x1 * x1 + y1 * y1) * sqrt(x2 * x2 + y2 * y2));printf("%.2lf\n", acos(res) * 180 / acos(-1));}
}
代码思路
#include <iostream>
:包含标准输入输出流头文件,用于输入输出操作。#include <math.h>
:用于使用数学相关的函数,如sqrt
(开平方根)等。
在main
函数中:
int T
:表示测试用例的数量。通过scanf_s
读取测试用例的数量T
。然后在循环中,对于每个测试用例:- 用
scanf_s
读取两个点的坐标x1
、y1
、x2
、y2
。 - 利用向量的点积公式计算出两个向量的点积除以两个向量模长的乘积,得到余弦值
res
。这里使用了数学公式来计算向量的相关信息。 - 最后通过
acos(res)
得到角度(弧度制),再将其转换为角度制并保留两位小数输出,通过acos(-1)
来表示圆周率。
- 用
2082.找单词
题目描述
Problem - 2082
运行代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int le[27], n1[51], n2[51];
void GF() {memset(n1, 0, sizeof(n1));memset(n2, 0, sizeof(n2));n1[0] = 1; for (int i = 1; i <= 26; ++i) {for (int j = 0; j <= 50; ++j)for (int k = 0; k <= min(le[i], (50 - j) / i); ++k) n2[j + k * i] += n1[j];copy_n(n2, 51, n1); memset(n2, 0, sizeof(n2)); }
}
int main() {int N;cin >> N;while (N--) {for (int i = 1; i <= 26; ++i) { cin >> le[i];}GF();int sum = 0;for (int i = 1; i <= 50; ++i)sum += n1[i];cout << sum << endl;}return 0;
}
代码思路
- 初始化:定义一个数组
n1
,其中n1[i]
表示长度为i
的组合的数量。由于空组合也是一种组合,所以n1[0]
被初始化为1。定义一个临时数组n2
,用于在迭代过程中存储中间结果。 - 动态规划:遍历字母表(从A到Z,即索引1到26):对于每个字母,遍历所有可能的组合长度(从0到50):对于每个组合长度
j
,再遍历当前字母可以出现的次数(从0到le[i]
):如果新的组合长度不超过50,则将n1[j]
的值加到n2[j + k * i]
上,因为所有长度为j
的组合都可以通过添加k
个当前字母来扩展为长度为j + k * i
的组合。计算新的组合长度j + k * i
(k
是当前字母出现的次数)。将n2
数组的内容复制到n1
数组,以准备下一轮迭代。将n2
数组重置为0。 - 计算总组合数:在完成所有字母的迭代后,
n1
数组中的值就表示了所有可能组合的数量(按长度分类)。遍历n1
数组(从索引1到50),将所有值相加,得到总组合数。 - 主程序:首先读取测试用例的数量
N
。对于每个测试用例,读取26个字母可以重复出现的次数(存储在le
数组中)。调用GF
函数来计算当前测试用例的总组合数。输出总组合数。
2085.核反应堆
题目描述
Problem - 2085
运行代码
#include <iostream>
using namespace std;
void FN(int n) {long long int high = 1;long long int low = 0;for (int i = 1; i <= n; i++) {long long int newHigh= 3 * high + 2 * low;long long int newLow = high + low;high = newHigh;low = newLow;}cout << high << ", " << low << endl;
}
int main() {int n;while (cin >> n && n != -1) {FN(n);}return 0;
}
代码思路
FN
函数用于计算特定时间n
微秒时高能质点和低能质点的数量。- 定义了两个变量
high
表示高能质点数量初始为 1,low
表示低能质点数量初始为 0。 - 通过一个循环,从 1 到
n
进行迭代。在每次迭代中,根据题目给定的规则计算新的高能质点数量(3 倍当前高能质点数量加上 2 倍当前低能质点数量)和新的低能质点数量(当前高能质点数量加上当前低能质点数量),然后更新这两个变量。
- 定义了两个变量
- 在
main
函数中,通过一个循环不断读取输入的时间n
,只要输入不为-1
,就调用FN
函数进行计算并输出结果。