CSP-J/S 备赛游戏:气球游戏 - 优化你的代码,赢取胜利!
众所周知,ty奥信队的同学们早已回归校园,积极地备赛CSP - J/S,他们的暑假比别的同学少一大半,但是在每位同学身上都可以看到自信和快乐的光芒! 这是因为每天老师都会组织同学们进行体育锻炼,并且给同学们玩一些有趣的体育游戏,今天的游戏是这样的:
体育老师拿出n个气球从左到右排成一排,每人气球上面都会有一个数字编号ai。你可以选择扎破某一些气球,但是最多只能扎破n - 1个气球,至少要剩下一个气球留在场上
假设目前你已经扎破了一些气球,场上还剩下m个气球,那么胜利的规则是这m个气球中的每一个气球i(1 < i< m如果气球上的数字a;恰好等于i,那么你将赢得游戏的胜利!
由于你的体力有限,所以你需要找到最小的扎破气球的数目,使得你能获得游戏的胜利,并把这个最小的数目输出出来;而如果无论怎么扎破气球都没办法赢得胜利,那么输出-1.
输入格式
第一行输入一个整数n表示气球的数量 第二行输入n个整数a1 a2 ... an,表示第i个气球上写着的数字
输出格式
输出能赢得游戏胜利的,最小的扎破气球的个数。 如果不能赢得游戏,输出 -1.
C++内容:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
sort(nums.begin(), nums.end());
int result = -1;
for (int i = 0; i < n; i++) {
if (nums[i] > i + 1) {
result = i;
break;
}
}
if (result == -1) {
result = n - 1;
}
cout << result << endl;
return 0;
}
代码解析:
- 首先,将输入的数字序列排序,方便后续判断。
- 遍历排序后的数字序列,寻找第一个数字
nums[i]大于i+1的位置。- 如果找到,说明需要扎破
i个气球才能保证剩下的气球数字与序号匹配。 - 如果没有找到,说明无论如何扎破气球,都无法保证剩下的气球数字与序号匹配。
- 如果找到,说明需要扎破
优化技巧:
- 可以使用二分查找优化寻找
nums[i] > i + 1的过程,降低时间复杂度。 - 可以将循环条件改为
i <= n,避免在最后单独判断result是否等于 -1。
更多挑战:
- 可以尝试修改游戏规则,例如:
- 允许扎破的气球数量不固定,但要保证至少剩下一个气球。
- 允许扎破的气球位置不连续。
快来挑战这个游戏,优化你的代码,成为赢家吧!
原文地址: http://www.cveoy.top/t/topic/qplo 著作权归作者所有。请勿转载和采集!