会飞的小香猪


私信TA

用户名:SerendipityZcy

访问量:525

签 名:

等  级
排  名 15863
经  验 824
参赛次数 0
文章发表 2
年  龄 20
在职情况 学生
学  校 东华理工大学
专  业 电子信息工程

  自我简介:


解题思路:1.通过计算我们可以发现输入的第一行数字N减去一就是要合并的次数即有N-1次循环

              2.每个数字都要用上最少一次,例如N=4;(2,3)(3,5)(5,10)(10,2)

                这里有四个珠子,循环三次(消去三次),2,3,5,10不管怎么列式子都要用上最少一次。

              3.既然每个数字要用上至少一次,那么越小的数就用一次,越大的数就让它多用几次

              4.每次消去都会把中间的数消掉,那么把最小的数字找出来依次消去,例如刚才的例子。第一次最小为2:消去即为:10*2*3;剩下为:(3,5)( 5,                    10)(10,3), 第二次最小为3,消去为:10*3*5;剩下为:(5,10)(10,5),那么最后一次最小的数字为5,消去为10*5*10,剩下的为(10 ,                10)

             5 .到这里刚好计算完成。我们可以发现一个规律,就是越大的数用的次数可能不止一次,但是每次循环小的数字都用了一次,并且每个数字都出现了至少一                次


注意事项:输入的格式要注意.

               1.可以采用两种方法来实现这个操作,一个线性的,即为数组,将输入的第二行数字存入数组中,每次循环找出最下的数字下标为i,sum=

               sum[i-1]*sum[i]*sum[sum+1],但是这种方法要注意边界条件,比如最小数字在i=0和i=N-1(即在数组的开头和末尾元素),操作完后可以将这个元素在                    数组中的值赋值为0或者负数什么的,这样下次循环找最小值就加一些判断语句,就可以跳过这些被用过的最小的数。

              2.还有链式的,即线性表,创建一个循环链表,每个指针数据域data储存珠子的值,然后指针指向下一个相邻的珠子,和线性存储一样的道理,每次循环找                 找出最小值来,然后sum=(p->pre->data)*(p->data)*(p->next->data);然后将p节点删除,再释放其内存,但是这种方法比起线性的方法来说显得更为                 繁琐,好处就是不用再每次循环相加后将数组内的元素标记,循环链表的方法可以直接删除,不用考虑数组的边界条件

#include
//第一次找到数组中的最大值 
int FoundMax(int N,int num[])
{
int a=0;int b=0;                      //a用来循环,b用来储存最大值 
for(a=0;a<N;a++)    //找到最大值 
    { 
      if(num[a]>b)
  {
b=num[a];
  }
    }
    return b;
}
int main()
{
int N;
scanf("%d",&N);
getchar();
int num[N];             //用来存储数据
int i=0;                //用来for循环,每次用完后置0 
for(i=0;i<N;i++)
{
scanf("%d",&num[i]);
    }
    
    int max=FoundMax(N,num);
    
    i=0;
    int sum=0;                     //要求的总值 
    for(i=0;i<N-1;i++)
{
    int min=max; 
int m=0;                  //用来储存最小值的下标 
int a;                    //a用来循环遍历 
for(a=0;a<N;a++)          //找到最小值并且用m返回下标
{
if(num[a]!=0)
{
if(num[a]<min)
{
min=num[a];
m=a;
}
}
}
if(m==0)
{
int a,b,c;
int pre=N-1;int rear=1;
b=num[0];
while(num[pre]==0)
{
pre--;
} 
while(num[rear]==0)
{
rear++;
}
a=num[pre];b=num[m];c=num[rear]; 
sum=a*b*c+sum;
}
else if(m==N-1)
{
int a=0;int b=0;int c=0;
int pre=N-2;int rear=0;
while(num[pre]==0)
{
pre--;
}
while(num[rear]==0)
{
rear++;
} 
a=num[pre];b=num[m];c=num[rear];
sum=sum+a*b*c;
}
else
{
   int a,b,c;
   int pre=m-1;int rear=m+1;
   while(num[pre]==0)
   {
    if(pre>0)
    {
    pre--;
    }
    else
    {
    pre=N-1;
    }
   }
   while(num[rear]==0)
    {
    if(rear!=N-1)
   {
    rear++;
   } 
   else
   {
    rear=0;
   }
    }

   a=num[pre];b=num[m];c=num[rear];
   sum=sum+a*b*c;
}
num[m]=0;
} 

printf("%d",sum);
return 0;
}


 

0.0分

2 人评分

  评论区

  • «
  • »