刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题

三足鼎立

当三个国家中的任何两国实力之和都大于第三国的时候,这三个国家互相结盟就呈“三足鼎立”之势,这种状态是最稳定的。

现已知本国的实力值,又给出 n 个其他国家的实力值。我们需要从这 n 个国家中找 2 个结盟,以成三足鼎立。有多少种选择呢?

时间限制:10000

内存限制:65536

输入

输入首先在第一行给出 2 个正整数 n(2 ≤ n ≤ 105)和 P(≤ 109),分别为其他国家的个数、以及本国的实力值。随后一行给出 n 个正整数,表示n 个其他国家的实力值。每个数值不超过 109,数字间以空格分隔。

输出

在一行中输出本国结盟选择的个数。

样例输入

7 30
42 16 2 51 92 27 35

样例输出

9

提示

样例解释: 能联合的另外 2 个国家的 9 种选择分别为: {16, 27}, {16, 35}, {16, 42}, {27, 35}, {27, 42}, {27, 51}, {35, 42}, {35, 51}, {42, 51}。


使用微信搜索喵呜刷题,轻松应对考试!

答案:

null

解析:

这个问题可以通过排序和遍历的方式解决。首先,将所有国家的实力值(包括本国)排序。然后,遍历每个国家,计算它与本国实力之和,并统计有多少个国家与本国实力之和大于第三个国家的实力值。累加这些计数即可得到答案。具体实现时需要注意处理重复的实力值。以下是一个可能的C语言实现:

#include <stdio.h>
#include <stdlib.h>

int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b); // 排序函数,按照实力值大小排序
}

int main() {
    int n, P; // n为其他国家数量,P为本国实力值
    scanf("%d %d", &n, &P); // 读入输入数据
    int other_powers[n]; // 存储其他国家的实力值
    for (int i = 0; i < n; ++i) {
        scanf("%d", &other_powers[i]); // 读入其他国家的实力值
    }
    qsort(other_powers, n, sizeof(int), compare); // 对其他国家的实力值进行排序
    long long count = 0; // 统计结盟选择个数
    for (int i = 0; i < n - 1; ++i) { // 遍历每个国家与本国结盟的情况
        long long sum = P + other_powers[i]; // 计算与本国结盟的国家的实力之和
        int j = lower_bound(other_powers, n, sum) - other_powers; // 找到大于该实力之和的第一个国家的位置(即第三个国家的位置)
        if (j > i + 1) { // 如果存在第三个国家,则计算结盟选择个数并累加
            count += j - i - 1; // 计算当前结盟选择的个数(即第三个国家之前的国家数量)并累加至总计数中
        }
    }
    printf("%lld\n", count); // 输出结果
    return 0;
}
创作类型:
原创

本文链接:三足鼎立 当三个国家中的任何两国实力之和都大于第三国的时候,这三个国家互相结盟就呈“三足鼎立”之势,

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share