题目描述 有N个冒险者,他们刚刚探索完了一片区域,现在他们正准备启航回家了,但他们只能乘坐小船回去。不幸的是, 现在只有K艘小船了,而每艘只能荷载C个单位重量。每个人身上还带了必要的东西不能丢弃,算上自身体重一共是 个单位重量。 他们的家离这里太远了,因此每艘船不能再开回来,现在你想知道他们能否在每个小船都不超载的情况下全都能坐上小船 输入 第一行一个正整数T,表示组数 每一组第一行三个正整数K,C,N 分别表示 K个荷载为C的小船和N个冒险者 每一组第二行N个正整数 a1,a2,a3....an分别表示N个冒险者的单位重量 输出 一共T行。每一组输出一个字符串,若每个冒险者都可以坐上小船则输出"Let's go",否则输出"find another way"根据上述描述生成参考代码
时间: 2024-02-13 14:06:50 浏览: 74
Jabra捷波朗Journey 启航者用户手册.pdf
参考代码如下:
```
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int k, c, n;
cin >> k >> c >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a.begin(), a.end()); // 将冒险者的单位重量从小到大排序
int left = 0, right = n - 1;
bool flag = true;
while (left <= right) {
if (a[left] + a[right] <= c && right - left + 1 <= k) { // 可以同时带走左右两个人
left++;
right--;
k--;
} else if (a[right] <= c && right - left < k) { // 只能带走右边的人
right--;
k--;
} else {
flag = false;
break;
}
}
if (flag) {
cout << "Let's go" << endl;
} else {
cout << "find another way" << endl;
}
}
return 0;
}
```
解题思路:
对于每一组数据,我们需要将所有冒险者的单位重量从小到大排序。然后我们使用双指针法,将左右指针指向最轻和最重的冒险者,如果他们的单位重量之和不超过小船的荷载,同时当前船的人数不超过k,那么就可以同时带走这两个人。否则,我们考虑只带走右边的人或者不能坐船,直到所有冒险者都坐上小船或者无法坐上小船。
时间复杂度分析:
对于每一组数据,我们需要将冒险者的单位重量从小到大排序,时间复杂度为O(nlogn);接下来我们使用双指针法,时间复杂度为O(n),因此总时间复杂度为O(nlogn)。
阅读全文