腾讯校招-石子合并-c++

2017-09-13  本文已影响0人  Jacinth

初始一共有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;
}
上一篇 下一篇

猜你喜欢

热点阅读