初始一共有n堆石子,每堆石子有w[i]个石子,对石子堆进行合并,每次任意选取两堆石子进行合并。一堆有x个石子的石子堆和一堆有y个石子的石子堆合并将得到一堆x+y个石子的石子堆,这次合并得分为x*y,当只剩下一堆石子的时候结束。希望获得最大得分,算出最大得分是多少?
输入:
输入包括两行,第一行一个正整数n(2<=n<=100)。
第二行包括n个正整数wi,即每堆石子的个数。
输出:
输出一个正整数,即最大得分是多少。
样例输入:
3
1 2 3
样例输出;
11
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <string>
#include <vector>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <algorithm>
#include <unordered_map>
using namespace std;
/*解题思路:贪心算法
每次选两堆最多的,合并直至只剩一堆为止
输入:
3
1 2 3
输出;
11*/
int main(){
int n;
cin>>n;
int stone[100];
int i=0;
do{
cin>>stone[i++];
}while(getchar()!='\n');
sort(stone,stone+n);
int cur=0;//得分
int tmp = stone[0];
for(int i = 1;i<n;i++){
cur = cur+tmp*stone[i];
tmp = tmp+stone[i];
}
cout<<cur<<endl;
return 0;
}
网友评论