PTA 7-5 三足鼎立(25分)

2023-11-11 09:30
文章标签 25 三足鼎立 pta

本文主要是介绍PTA 7-5 三足鼎立(25分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PTA 7-5 三足鼎立(25分)

  • 输入格式
  • 输出格式
  • 输入样例
  • 输出样例
  • 样例解释
  • 限制条件
  • C++代码
  • 运行结果

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

输入格式

请添加图片描述

输出格式

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

输入样例

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}。

限制条件

限制条件数量
代码长度限制16 KB
时间限制400 ms
内存限制64 MB

C++代码

#include <iostream>using namespace std;void subheap(int a[], int i, int n) //比较父结点和子结点,在子树中生成最大堆
{int parent = i;int child = 2 * i + 1; //堆从0开始,父结点为i,则左孩子为2i+1while(child < n){if(child + 1 < n && a[child] < a[child + 1]) //如果这个父结点有右孩子,并且右孩子比左孩子大{child += 1; //child的值是左右孩子中较大孩子的位置}if(a[child] > a[parent]) //如果孩子结点比父结点大,交换二者{int tem = a[child];a[child] = a[parent];a[parent] = tem;parent = child;}child = child * 2 + 1; //由上至下做比较}
}void trip(int a[], int num) //第一趟堆排序,将最大值放到根结点的位置 //num为数组元素个数
{for(int i = num / 2 - 1; i >= 0; i--) // n/2+1是倒数第二排最后一个位置,也就是右下角那棵子树的根结点{subheap(a, i, num);}
}void heapsort(int a[], int num) //堆排序
{trip(a, num);for(int i = num - 1; i > 0; i--){int f = a[0];a[0] = a[i];a[i] = f; //交换根结点和最后一个元素的位置subheap(a, 0, i);}}/* 这个排序会有四个测试点显示超时
int trip(int a[], int left, int right) //一趟快速排序
{int pivot = a[left];while(left < right){while(left < right && a[right] >= pivot) //left和right一直在变{right--;}a[left] = a[right];while(left < right && a[left] <= pivot){left++;}a[right] = a[left];}a[left] = pivot; //此时left=rightreturn left; //返回这一趟pivot的位置
}void quicksort(int a[], int left, int right) //快速排序
{if(left < right){int piv = trip(a, left, right);quicksort(a, left, piv - 1);quicksort(a, piv + 1, right);}
}
*/long binarysearch(int a[], int left, int right, int p) //二分查找
{int num = right;long cnt = 0;for(int i = 0; i < num; i++){int sum = a[i] + p; //和int dif; //差if(a[i] - p > 0){dif = a[i] - p;}else{dif = p - a[i];}left = i + 1;right = num;while(left <= right) //这里要有等号{int mid = (left + right) / 2;if(a[mid] >= sum){right = mid - 1;}else //没有else,left<=right一直成立,死循环{left = mid + 1;}}int high = right;left = i + 1;right = num;while(left <= right){int mid = (left + right) / 2;if(a[mid] <= dif){left = mid + 1;}else{right = mid - 1;}}int low = left;int tem = high - low + 1;cnt += tem;}return cnt;
}int main()
{int n, p;cin >> n >> p; //其他国家的个数n 本国的实力值pint sv[n]; //n个国家的实力值for(int i = 0; i < n; i++){int a;cin >> a;sv[i] = a;}heapsort(sv, n);//quicksort(sv, 0, n - 1); //数组索引从0开始//sort(sv, sv + n); //sort不超时/* 暴力破解会超时int cnt = 0; //记录符合条件的组合数量for(int i = 0; i < n - 1; i++){int sum = sv[i] + p;int dif;if(sv[i] - p > 0){dif = sv[i] - p;}else{dif = p - sv[i];}for(int j = i + 1; j < n; j++){if(sv[j] < sum && sv[j] > dif){cnt++;}}}cout << cnt;
*/cout << binarysearch(sv, 0, n - 1, p);return 0;
}

运行结果

请添加图片描述

这篇关于PTA 7-5 三足鼎立(25分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

【JavaScript】LeetCode:21-25

文章目录 21 最大子数组和22 合并区间23 轮转数组24 除自身以外数组的乘积25 缺失的第一个正数 21 最大子数组和 贪心 / 动态规划贪心:连续和(count)< 0时,放弃当前起点的连续和,将下一个数作为新起点,这里提供使用贪心算法解决本题的代码。动态规划:dp[i]:以nums[i]为结尾的最长连续子序列(子数组)和。 dp[i] = max(dp[i - 1]

2025年25届计算机毕业设计:如何实现高校实验室Java SpringBoot教学管理系统

✍✍计算机毕业编程指导师** ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、Python、微信小程序、大数据实战项目集 ⚡⚡文末获取源码 文章目录 ⚡⚡文末获取源码高校实验室教学管理系统-研究背景高校实验室教学管理系

智力题:25匹马5条跑道找最快的3匹马,最少需要跑几次?

要找出25匹马中最快的3匹马,使用5条跑道,最少需要跑几次?我们可以通过逐步推理来解决这个问题。 第一步:分组比赛 首先,我们将25匹马分成5组,每组5匹马。每组进行一次比赛,这样我们就有5次比赛的结果。 组1:A1, A2, A3, A4, A5 组2:B1, B2, B3, B4, B5 组3:C1, C2, C3, C4, C5 组4:D1, D2, D3, D4, D5 组

芬兰手游业25年发展史

自2010年Rovio凭借《愤怒的小鸟》成功以来,芬兰的优秀开发者可以说是不断的引领手游潮流,有Frogmid、Seriously这样的小型团队,也有Supercell这样的世界收入冠军。除却收入之外,我们可以发现芬兰开发商的手游绝大多数都是具有独特创意的。 为什么芬兰手游业可以具有如此之大的竞争优势?其他人想要赶上应该怎么做?这个答案从来都不是能够简单作答的,因为它根植于芬兰的行业发展史,所以

pta-2024年秋面向对象程序设计实验一-java

文章申明:作者也为初学者,解答仅供参考,不一定是最优解; 一:7-1 sdut-sel-2 汽车超速罚款(选择结构) 答案: import java.util.Scanner;         public class Main { public static void main(String[] arg){         Scanner sc=new Scanner(System

图形API学习工程(25):实现法线贴图

工程GIT地址:https://gitee.com/yaksue/yaksue-graphics 目标 在《图形API学习工程(10):基础光照》中,我实现了最基础的光照,同时也表现了法线的作用。 在《图形API学习工程(11):使用纹理》中,工程已经能够加载纹理贴图。 这样,法线贴图 所需的准备已经完成,可以在工程里实现这个技术了。 (关于法线贴图的意义,可见上一篇博客《从“法线贴图的意义

【简历】25届南京某一本JAVA简历:简历通过率还好,但是拿不到OFFER

注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 今天看一份25届南京某一本大学的Java简历。 这个简历呢,学校是一本。我们说上来先要定校招层次,这个层次就按照中厂来讲。因为现在很多的双非一本目标都是在中厂。 这个同学有个实习经历,一本有八成的同学主项目都是重复的。HR他只能看到项目重不重复,要点对不对他不知道,就从这个角度来看,这位同学

GNU的伪操作 (25)

这里主要是 对 GNU的 各个伪操作进行 详细的解释。 先来看着几个 伪操作。 .byte,  .short,  .long,  .quad , .float ,  这个是关于 字节的。 .string   .ascii 是关于字符串的。 这个字符串编译器是可以自动在末尾补0 的。 举例: val:         .word 0x11223344         m

25版王道数据结构课后习题详细分析 第八章 8.2 插入排序

一、单项选择题 ———————————————————— ———————————————————— 解析:直接插入排序在最坏的情况下要做n(n-1)/2次关键字的比较,当n=5时, 关键字的比较次数为10。注意不考虑与哨兵的比较。 正确答案: ———————————————————— ———————————————————— 解析:由于序列初始基本有序,因此使用直接插入排序