1 条题解
-
1
编译错误
C
说明
本题要求计算开启n个神秘宝箱后能获得的最少金币数和最大金币数。解题思路如下:
- 最少金币数:每个宝箱都取最少金币数l_i,总和即为所有l_i的累加和
- 最大金币数:每个宝箱都取最大金币数r_i,总和即为所有r_i的累加和
由于n最大为100000,每个数值最大为10^9,总和可能达到10^14(100000×10^9),超过了C语言中int类型的表示范围(int最大约2×10^9),因此需要使用long long类型(64位整数,可表示范围约-9×10^18到9×10^18)来存储总和。整个过程需要遍历n个宝箱,时间复杂度为O(n)(随n线性增长)。
代码
#include <stdio.h> int main() { int n; scanf("%d", &n); // 使用long long类型存储总和,避免数值溢出 long long sum_min = 0, sum_max = 0; for (int i = 0; i < n; i++) { long long l, r; // %lld是long long类型的格式控制符 scanf("%lld %lld", &l, &r); sum_min += l; sum_max += r; } // 输出long long类型时同样使用%lld printf("%lld %lld\n", sum_min, sum_max); return 0; }C语言拓展知识
推荐搜索:C语言整数类型范围(int、long long的区别)、scanf/printf对long long的格式控制(%lld的用法)、整数溢出的危害及避免方法。
C++
说明
本题与C语言解法思路完全一致:累加所有宝箱的最小金币数l_i得到最少总金币,累加所有最大金币数r_i得到最大总金币。C++实现时,需注意使用long long类型存储总和以避免溢出,同时可通过输入输出优化提升大数据量下的处理速度。
万能头文件
#include<bits/stdc++.h> 是C++非标准头文件(竞赛常用),包含所有标准库(如输入输出库、容器库、算法库),无需手动逐个包含,适合快速编码。
新知识
-
64位整数类型:
- 术语:
long long - 解释:与C语言的long long一致,是64位整数类型,用于存储超出int范围的大整数(如本题中10^14级别的总和)。
- 对比:C和C++都支持long long,但C++中cout输出long long时无需格式控制符,而C语言的printf需要%lld。
- 术语:
-
输入输出优化:
- 术语:
ios::sync_with_stdio(false); cin.tie(0); - 解释:关闭cin与stdio的同步(默认开启以保证兼容性),并解除cin与cout的绑定,可显著提高cin/cout的输入输出速度,适合处理n=1e5级别的大量数据。
- 对比:C语言的scanf/printf本身速度较快,无需额外优化;C++的cin/cout默认速度较慢,加上此优化后可接近scanf/printf的效率。
- 术语:
AC
#include <bits/stdc++.h> using namespace std; int main() { // 输入输出优化:加快cin/cout处理大量数据的速度 ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; // long long类型存储总和,避免溢出 long long sum_min = 0, sum_max = 0; for (int i = 0; i < n; i++) { long long l, r; cin >> l >> r; sum_min += l; sum_max += r; } cout << sum_min << " " << sum_max << endl; return 0; }C++拓展知识
推荐搜索:C++中long long与int的性能对比、cin/cout优化的原理(ios::sync_with_stdio的作用)、C++输入输出流的缓冲区机制。
- 1
信息
- ID
- 487
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- (无)
- 递交数
- 134
- 已通过
- 35
- 上传者