贪心算法练习:数列极差问题

news/2025/2/19 14:58:05/

在黑板上写n个正整数排成的一个数列,进行如下操作:
每次擦掉其中的两个数a和b,然后在数列里面加入一个数a*b+1,
如此循环往复直到黑板上只剩下一个数,在所有按这种操作方式
最后得到的数中,最大的记为max,最小的记min,则该数列的极差
定义为m=max-min。
输入一个正整数n,然后输入n个正整数构成一个数列。
输出这n个正整数构成的数列的极差。

  1 #include<stdio.h>2 #include<stdlib.h>3 long maxNumber;//整个数组里面的最大的数 4 long maxNumberIndex;5 long max(long *a,long len);6 long min(long *a,long len);7 8 int main()9 {10     long *a,*b,n,i,maxN,minN;11     freopen("5.in","r",stdin);12     scanf("%ld",&n);13     a=(long *)malloc(sizeof(long)*n);14     b=(long *)malloc(sizeof(long)*n);15     for(i=0;i<n;i++)16     {17         scanf("%ld",a+i);18         b[i]=a[i];19     }20     minN=min(b,n);//注意:必须先调用min()函数再调用max()函数 21     maxN=max(a,n);22     //printf("%ld %ld\n%ld\n",maxN,minN,maxN-minN);23     printf("%ld\n",maxN-minN);24     return 0;25 }26 long max(long *a,long len)//返回相乘结果最大的那个乘积 27 {28     long i,min1,min2,min1Index,min2Index,m;//min1,min2表示最小和次小的两个数的值。min1Index和min2Index表示最大和次大的两个数的下标 29     //注意:数组a里面最小和次小的两个数可以是一样大小,但不可能是下标相同的两个数 .30     while(len>1)31     {32         min2=min1=maxNumber;33         min2Index=min1Index=maxNumberIndex;34         for(i=0;i<len;i++)35         {36             if(a[i]<min1)37             {38                 min2=min1;39                 min2Index=min1Index;40                 min1=a[i];41                 min1Index=i;42             }43             else if(a[i]<min2)44             {45                 min2=a[i];46                 min2Index=i;47             }48         }49         m=min1*min2+1;50         51         if(min1Index>min2Index)52         {53             a[min2Index]=m;54             if(m>maxNumber)55             {56                 maxNumber=m;//更新当前数组里面的最大值 57                 maxNumberIndex=min2Index;58             }59             a[min1Index]=a[len-1];60             len--;61         }62         else 63         {64             a[min2Index]=a[len-1];65             a[min1Index]=m;66             if(m>maxNumber)67             {68                 maxNumber=m;//更新当前数组里面的最大值 69                 maxNumberIndex=min1Index;70             }71             maxNumberIndex=min1Index;72             len--;73         }74     }75     return a[0];76 }77 long min(long *a,long len)//返回相乘结果最小的那个乘积 78 {79     long i,max1,max2,max1Index,max2Index,m;//max1,max2表示最大和次大的两个数的值。max1I和max2I表示最大和次大的两个数的下标 80     //注意:数组a里面最大和次大的两个数可以是一样大小,但不可能是下标相同的两个数 .81     int f=0;82     while(len>1)83     {84         max2=max1=-1;85         max2Index=max1Index=-1;86         for(i=0;i<len;i++)87         {88             if(a[i]>max1)89             {90                 max2=max1;91                 max2Index=max1Index;92                 max1=a[i];93                 max1Index=i;94             }95             else if(a[i]>max2)96             {97                 max2=a[i];98                 max2Index=i;99             }
100         }
101         m=max1*max2+1;
102         if(f==0)
103         {
104             maxNumber=max1;//保存整个数组的最大值,以便在调用max()函数的时候方便寻找最小的两个数。 
105             maxNumberIndex=max1Index;
106             f=1;
107         }
108         if(max1Index>max2Index)
109         {
110             a[max2Index]=m;
111             a[max1Index]=a[len-1];
112             len--;
113         }
114         else 
115         {
116             a[max2Index]=a[len-1];
117             a[max1Index]=m;
118             len--;
119         }
120     }
121     return a[0];
122 }

http://www.ppmy.cn/news/312.html

相关文章

Python学习笔记第二十九天(N维数组(ndarray))

Python学习笔记第二十九天N维数组&#xff08;ndarray&#xff09;构建阵列索引阵列ndarray的内部内存布局阵列属性内存布局数据类型其他属性阵列接口ctypes外部功能接口Array方法阵列转换形状操作项目选择和操作计算算术&#xff0c;矩阵乘法和比较运算结束语N维数组&#xff…

Redis五种基本数据类型

文章目录 1.Redis 简介2.Redis 安装3.Redis 五种基本数据类型1.StringBIT 命令2.List3.Set4.Hash5.ZSet6.key7.补充1.Redis 简介 Redis 是我们在互联网应用中使用最广泛的一个 NoSQL 数据库,基于 C 开发的键值对存储数据库,Redis 这个名字是 Remote Dictionary Service 字母…

一文让你理解Linux权限问题

前言&#xff1a; 权限是个很重要的一部分&#xff0c;无论是在Linux系统中还是在生活里&#xff0c;权限都是必不可缺失的一部分&#xff0c;在生活中&#xff0c;权限是很常见的&#xff0c;例如VIP&#xff0c;如果你不是VIP你就不能享用VIP的一些特有的功能&#xff0c;这就…

11.30 - 每日一题 - 408

每日一题&#xff1a;世间没有一种具有真正价值的东西&#xff0c;可以不经过艰苦辛勤劳动而能够得到的。 数据结构 1 在平衡二叉树中插入一个结点后造成了不平衡&#xff0c;设最低的不平衡结点为A&#xff0c;并已知A的左孩子的平衡因子为一1&#xff0c;右孩子的平衡因子为…

Python爬虫学了几个月却不敢接单?过来人的经验总结收好!

前几天有刷到一个提问&#xff1a;爬虫学了几个月了却还是不敢上手去接单&#xff0c;爬虫接单靠不靠谱&#xff1f;有些新手心里会犯嘀咕&#xff0c;怕不小心就踩了红线。作为过来人也接过不少单&#xff0c;来浅聊一下我的经验。 这篇所说的经验总结可能更适合爬虫新手&…

复习计算机网络——第二章记录(1)

物理层的概念: 数据终端设备&#xff08;DTE&#xff09;与数字电路终接设备&#xff08;DCE&#xff09;的接口。 物理层功能&#xff1a;通过规定物理设备和物理媒体之间的接口技术&#xff0c;实现物理设备之间的比特流透明传输。 物理层服务&#xff1a;建立、维持和释放…

硬件定义软件?还是,软件定义硬件?

文章目录**1 软件和硬件****1.1 软件和硬件的定义****1.2 “硬件定义软件”和“软件定义硬件”的定义****1.3 CPU&#xff0c;软件和硬件解耦****1.4 CPU的软硬件定义****2 硬件定义软件****2.1 系统从软件逐步到硬件****2.2 硬件架构决定了软件设计****2.2.1 ASIC的硬件定义**…

【C语言初阶(NEW)】五、操作符详解(二)|隐式类型转换|算术转换|操作符的属性

目录 一、表达式求值 1.1 隐式类型转换 1.1.1 什么是整型提升&#xff08;整型提升&#xff09; 1.1.2 整型提升的意义 1.1.3 有符号&#xff08;signed&#xff09;与无符号&#xff08;unsigned&#xff09;的区别 1.1.4 有符号&#xff08;signed&#xff09;类型的整…