【数据结构与算法暑期实习】PTA 三足鼎立

2023-11-11 09:31

本文主要是介绍【数据结构与算法暑期实习】PTA 三足鼎立,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PTA 三足鼎立

  • 一、题目
  • 二、思路
  • 三、代码

一、题目

当三个国家中的任何两国实力之和都大于第三国的时候,这三个国家互相结盟就呈“三足鼎立”之势,这种状态是最稳定的。现已知本国的实力值,又给出 n 个其他国家的实力值。我们需要从这 n 个国家中找 2 个结盟,以成三足鼎立。有多少种选择呢?

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

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

输入样例:
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}。

二、思路

由题意,“三足鼎立”的条件相当于三角形三边关系:a+b>c,a+c>b,b+c>c。其中一条边为已知。三个约束条件,两个变量,考虑变换形式,使其中一个变量可以表示另一个。将约束条件整理为:|a-b|<c<a+b,b为已知,可以b为自变量推出的c的变化范围,于是题意变为:求在给定的b下,满足条件的c有多少个,进而可以用二分搜索求出上下界从而求解。

另外需要注意的是,使用二分搜索时序列必须为有序序列。因此首先要对输入的国家序列进行排序。这里使用的是堆排序。(本次实习中不可以用stl,需要自己写sort。简单选择排序和快速排序都不行,会超时)

关于排序算法:
请添加图片描述
快速排序在n很大时效果不好,但是堆排序就很适合用于n较大的情况。

三、代码

堆排序

#include<stdio.h>
#include<stdlib.h>
#include<time.h>/* 堆排序中的一次调整 */
void OneAdjust(long long* arr, long long len, long long root)
{int tmp = arr[root];int left = 2 * root + 1;int right = 2 * root + 2;while (left < len){int max = left;/*找左右孩子中谁的值更大*/if (right < len && arr[left] < arr[right]){max = right;}/*若左右孩子中的较大者,也小于当前子树的根结点,则不变;否则令该根结点的数值与左右孩子中的较大者交换*/if (arr[max] < tmp){break;}else {arr[root] = arr[max];root = max;left = 2 * root + 1;right = 2 * root + 2;}}arr[root] = tmp;
}/* 建立大根堆 */
void CreateHeap(long long* arr, long long len)
{int root = (len-2)/2;//最后一个结点的下标是len-1,算出的root为最后一棵子树的根结点下标,也就是从此处开始调整堆。for (; root >= 0; --root){OneAdjust(arr, len, root);}
}/* 交换函数 */
void Swap(long long* x, long long* y)
{long long tmp = *x;*x = *y;*y = tmp;
}/* 堆排序 */
void HeapSort(long long* arr, long long len)
{CreateHeap(arr, len);for (int i = 0; i < len - 1; ++i){Swap(&arr[0], &arr[len-1-i]);OneAdjust(arr, len-i-1,0); //(len-i-1)表示当前步所调整的树的最大下标。}
}

主程序(二分搜索)

int main()
{long long n, mypower;long long othersPower[100001];long long num = 0;scanf_s("%lld %lld", &n, &mypower);//注意输出的特殊格式for (long long i = 0; i < n; i++) {scanf_s("%lld", &othersPower[i]);}HeapSort(othersPower, n);for (long long i = 0; i < n; i++){long long min = abs(mypower - othersPower[i]); //下界abs(a-b)long long max = mypower + othersPower[i]; //上界a+b.程序要求的就是处于上下界之间的元素个数。long long left = i + 1, right = n - 1; long long num1, num2 = 0;//二分查找,在升序序列中找到符合要求的起始点。while (left <= right){long long mid = (left + right + 1) / 2;if (othersPower[mid] > min)  right = mid - 1;else left = mid + 1;}num1 = left;left = i + 1, right = n - 1;//二分查找,在升序序列中找到符合要求的起始点。while (left <= right){long long mid = (left + right + 1) / 2;if (othersPower[mid] >= max) right = mid - 1;else left = mid + 1;}num2 = right;num =num + num2 - num1 + 1;}printf("%lld", num);return 0;
}

这篇关于【数据结构与算法暑期实习】PTA 三足鼎立的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/389112

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int