Stone(思维)

链接:https://ac.nowcoder.com/acm/contest/893/D
来源:牛客网

题目描述

有n堆石子排成一排,第i堆石子有 aiai个石子。
每次,你可以选择任意相邻的两堆石子进行合并,合并后的石子数量为两堆石子的和,消耗的体力等价于两堆石子中石子数少的那个。
请问,将所有的石子合并成一堆,你所消耗的体力最小是多少?

输入描述:

第一行是一个整数T(1T20)T(1≤T≤20),表示样例的个数。
每个样例的第一行是一个整数n(1n10000)n(1≤n≤10000),表示石子堆的数量。
第二行是n个整数ai(1ai109)ai(1≤ai≤109)

输出描述:

每行输出一个样例的结果。
示例1

输入

复制
2
2
1 2
1
1

输出

复制
1
0

说明

巨大的输入,请使用C风格的输入。
思路:把最大的一堆挑出,其余求和
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<map>
#include<cmath>
const int maxn=1e5+5;
typedef long long ll;
using namespace std;

int main()
{

   int T;
   cin>>T;
   while(T--)
   {
       int n;
       cin>>n;
       ll sum=0;
       int maxx=0;
       int x;
       for(int t=0;t<n;t++)
       {
           scanf("%d",&x);
           sum+=x;
           maxx=max(maxx,x);
    }
    printf("%lld\n",sum-maxx);
   }
   return 0;
}

猜你喜欢

转载自www.cnblogs.com/Staceyacm/p/10816773.html