双人成形
描述
小明最近组织了一场探险,这场探险需要两个人组队才能完成,在组队是,探险家们不希望自己的队友太差所以如果两人的战斗力相差大于等于x,则无法完成组队,现在小明想要知道,能组成几个小队
输入
多组数据,每组数据有两行.
第一行2个整数n,x,n是人数,(n<=100000,x<=10^9)
第二行是n个整数,表示每个人的战斗力
输出
每组数据一个输出,表示最多能组几个小队。
输入样例 1
4 3
1 3 3 2
4 2
1 4 6 2
输出样例 1
2
1
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n, x;
cin >> n >> x;
vector<int> power(n);
for (int i = 0; i < n; i++) {
cin >> power[i];
}
sort(power.begin(), power.end());
int teams = 0;
int left = 0, right = n - 1;
while (left <= right) {
if (power[left] + power[right] <= x) {
teams++;
left++;
right--;
} else {
teams++;
right--;
}
}
cout << teams << endl;
}
return 0;
}
【以下回答由 GPT 生成】
我可以为您提供一个解决方案。首先,我们可以使用以下步骤来解决这个问题:
从输入中读取每组数据的数量n和战斗力差距阈值x。
从输入中读取n个整数,表示每个人的战斗力,并将它们存储在一个列表中。
创建一个计数器变量team_count,用于记录可以组成的小队数量,初始值为0。
迭代遍历列表中的每个人的战斗力,并将当前人的战斗力与列表中的其他人进行比较。
如果一个人的战斗力与任何其他人的战斗力差距小于x,则将team_count加一。
输出team_count作为结果。
以下是示例代码实现:
while True:
try:
# 读取输入数据
n, x = map(int, input().split())
powers = list(map(int, input().split()))
# 初始化小队数量计数器
team_count = 0
for i in range(n):
for j in range(n):
if abs(powers[i] - powers[j]) < x:
team_count += 1
# 输出结果
print(team_count // 2)
except:
break
这个解决方案会遍历每个人的战斗力并进行比较。如果两个人的战斗力差距小于x,则将小队数量计数器递增。然后将最终的小队数量除以2,并将结果作为输出。
请注意,如果输入数量很大(如100000),该解决方案的时间复杂度为O(n^2),可能会导致程序运行时间较长。在实际应用中,可能需要找到更优化的算法来解决这个问题。
【相关推荐】