要求最小的开销,意思就是最小的木块要放在最后切,这样最小的木块就会经历最多次数的累加。
而最小的木块 一定还伴随着另一块木块,同理它应该也是次小的木块。
所以就要每次找出最小的和次小的木块,将其加和,再将和累积到开销变量ans上。
如果每合成一次木块就要排序一次的话会有点耗时,而且每次合成完之后分别用来代表最小和次小木块的下标的mii1,mii2就已经废弃不用了,这时可以把他们的和K赋值给mii1,再把最后一个元素a[n-1]的值赋给a[mii2],在n-=1也就是数组缩小一个单位。(如若mii1==n-1那么就将mii1和mii2交换)随后再遍历数组比较得出最小与次小值即可。
值得一说- -这道题提交了好多次都是wrong answer又检查了好久算法也没有发现错漏,最后竟然发现是输出长度不够,必须要改成__int64 的声明和“%I64d”的输出
#include "stdio.h"
#include "stdlib.h"
#include "algorithm"
#include "iostream"
using namespace std;
void solve(int a[],int n);
main()
{
int a[20500]={0},n,i,j;
scanf("%d",&n);
for(i=0;i
1;n-=1){
mii1=0,mii2=1;
if(a[mii1]>a[mii2]){
swap(mii1,mii2);
}
for(j=2;j