任务描述
本关任务:将 n 个正整数作成的一个数列,进行如下操作:每一次删除其中的两个数 a 和 b,然后在数列中加入一个数a×b+1,如此下去直至数列中剩下一个数。
在所有按这种操作方式最后得到的数中,最大的记作 max,最小的记作 min,则该数列的极差定义为M=max-min,请你使用贪心算法设计编程输出他们的极差。
编程要求
请在右侧编辑器Begin-End处补充代码,完成本关任务(注意已经为你获取输入数据)。
测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:
7 //输入7(n)个整数
3 //此行及以下为具体的每个数据
5
7
9
11
13
15
预期输出:Max=max-min=2221298-2038489=182809
#include <stdio.h>
/********* Begin **********/
int s1,s2;
void max2(int a[],int n)
{
int j;
if(a[1]>=a[2])
{
s1=1;
s2=2;
}
else
{
s1=2;
s2=1;
}
for (j=3;j<=n;j++)
{
if(a[j]>a[s1])
{
s2=s1;
s1=j;
}
else if(a[j]>a[s2])
s2=j;
}
}
int calculatemin(int a[],int n)
{
while (n>2)
{
max2(a,n);
a[s1]= a[s1]* a[s2]+1;
a[s2]=a[n];
n=n-1;
}
return(a[1]* a[2]+1);
}
void min2(int a[ ],int n)
{
int j;
if(a[1]<=a[2])
{
s1=1;
s2=2;
}
else
{
s1=2;
s2=1;
}
for (j=3;j<=n;j++)
{
if (a[j]<a[s1])
{
s2=s1;
s1=j;
}
else if (a[j]<a[s2])
s2=j;
}
}
int calculatemax(int a[],int n)
{
while (n>2)
{
min2(a,n);
a[s1]= a[s1]* a[s2]+1;
a[s2]=a[n];
n=n-1;
}
return(a[1]* a[2]+1);
}
int length(int a[])
{
int i=1;
while(a[i]!=0)
{
i++;
}
return i-1;
}
int main()
{
int i,n,b[100],max,min,num;
scanf("%d",&num);
int a[num+1];
for (i=1;i<=num;i++)
scanf("%d",&a[i]);
for (i=1;i<=num;i++)
b[i]=a[i];
min= calculatemin(a,num);
max= calculatemax(b,num);
printf("Max=max-min=%d-%d=%d\n",max,min,max-min);
}
/********* End **********/