解题思路: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 人评分
C语言训练-立方和不等式 (C语言代码)浏览:779 |
C语言训练-计算:t=1-1/(2*2)-1/(3*3)-...-1/(m*m) (C语言代码)浏览:799 |
WU-拆分位数 (C++代码)浏览:819 |
数字游戏 (C++代码)浏览:1240 |
核桃的数量 (C语言代码)浏览:893 |
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:525 |
C二级辅导-计负均正 (C语言代码)浏览:664 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:745 |
检查金币 (C语言代码)浏览:1505 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:607 |