文章目录
- 1. 题目链接
- 2. 题目代码
- 3. 题目总结
- 4. 代码分析
1. 题目链接
I Wanna Be the Guy
2. 题目代码
#include<iostream>
#include<set>
using namespace std;
int main(){int highestLevelOfGame;cin >> highestLevelOfGame;set<int> levelCanPass;int levelOfXPass;cin >> levelOfXPass;int level;while(levelOfXPass --){cin >> level;levelCanPass.insert(level);}int levelOfYPass;cin >> levelOfYPass;while(levelOfYPass --){cin >> level;levelCanPass.insert(level);}if(levelCanPass.size() == highestLevelOfGame){cout << "I become the guy.";}else{cout << "Oh, my keyboard!";}return 0;
}
3. 题目总结
用时:31min
卡住原因:审题不清 – 以为整个第二行都是X可以通过的等级,第三行都是Y可以通过的等级,从而认为第二、三的数据个数无法判断。于是想到用string类型的数据获取二、三行数据(考虑到有空格,输入方式应该采用getline(cin, 字符串名) )。接下来的代码实现我考虑了两个方案:① 使用双重for循环。第一层循环遍历游戏的等级(1-n),第二层循环遍历X、Y可以通过的等级。看看是否X、Y是否包含1到n的所有数值。② 单重循环。但是要把X、Y字符串里的所有数据先整合到一个set容器里。
4. 代码分析
参照代码来源:
注:set.count()
#include <iostream>
#include <set>using namespace std;int main() {int n;cin >> n;set<int> x_levels, y_levels;int p;cin >> p;for (int i = 0; i < p; ++i) {int level;cin >> level;x_levels.insert(level);}int q;cin >> q;for (int i = 0; i < q; ++i) {int level;cin >> level;y_levels.insert(level);}bool can_pass_all_levels = true;for (int i = 1; i <= n; ++i) {if (!(x_levels.count(i) || y_levels.count(i))) {can_pass_all_levels = false;break;}}if (can_pass_all_levels) {cout << "I become the guy." << endl;} else {cout << "Oh, my keyboard!" << endl;}return 0;
}
我的代码耗时:78ms
内存占用:0KB
问:为什么人家的代码比我多了一个for循环,但是比我的耗时还少?
答(回复来自gpt):
代码比对:
① 输入处理方式:
参考代码:通过明确读取 p 和 q 的值来确定循环次数,然后每次循环分别读取并插入到两个不同的 set 中。
我的代码:使用了 while 循环来处理输入,但没有显式地指定循环次数,而是依赖 levelOfXPass 和 levelOfYPass 变量来控制循环次数。这种方式可能在输入处理上引入了更多的复杂性和可能的性能开销。
集合操作:
② 集合操作:
参考代码:在判断是否可以通过所有关卡时,通过遍历从 1 到 n 的整数来检查每个关卡是否在 x_levels 或 y_levels 中。
我的代码:通过比较 levelCanPass 集合的大小和 highestLevelOfGame 的值来判断是否可以通过所有关卡。这种方法简化了判断逻辑,但在集合操作上,需要考虑集合的插入和去重操作的性能开销。
性能差异的可能原因:
① 输入操作效率:
我的代码的输入处理方式可能会比第一段代码更复杂,尤其是在处理大量输入时,可能会影响整体性能。
② 集合操作效率:
虽然两者都使用了 set 数据结构,但集合的插入操作可能受到输入量的影响。特别是我的代码中的 insert 操作可能需要更多的内部重排或重新哈希,这可能会导致性能略微下降。
优化建议:
简化输入处理逻辑,减少不必要的数据结构操作,以及选择更适合具体应用场景的数据结构和算法。