任务要求
将 n 个正整数作成的一个数列,进行如下操作:每一次删除其中的两个数 a 和 b,然后在数列中加入一个数 a×b+1,如此下去直至数列中剩下一个数。
在所有按这种操作方式最后得到的数中,最大的记作 max,最小的记作 min,请你使用贪心算法设计编程输出他们的值。
输入:
7 3 5 7 9 11 13 15
输出:2221298 2038489
#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];
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("%d %d\n",max,min);
}
/********* End **********/