标签:
题目描述
sed同学最近迷上了制造机器狗,购置了大量所需零件,零件可以组装为一个组件,这些组件或零件又可以组装为一个大的组件。在制造机器狗中,组件或零件只能两两进行组装,组装的顺序任意。在机器狗中,每个零件都有一个组装成本,每次组装一个组件的费用为各个零件组装成本之和。给定各个零件组装成本(单位为元),你的任务是帮助sed计算他至少花费多少费用。
输入
第一行包括一个整数N,表示机器狗零件数(1≤N≤10000)
第二行为N个正整数,表示每个机器狗零件组装成本(单位为元),整数之间用空格隔开。
输出
输出仅一行,即机器狗组装的最少费用。
注意:输出部分的结尾要求包含一个多余的空行。
样例输入
10
1 2 3 4 5 6 7 8 9 0
样例输出
136
解题思路
题目抽象起来就是n个数字的两两合并 明显可以用贪心来解 只需要知道当前的最小的两个零件 把它们组合起来即可。O(n^2)搞定 详见代码
#include <cstdio> #include <algorithm> #define ll long long #define INF 1000000010 using namespace std; const int maxn = 10010; int s[maxn]; int main() { int n; scanf("%d",&n); for(int i = 0 ; i < n ; i ++) scanf("%d",&s[i]); ll sum = 0; if(n == 1) { printf("%d\n",s[0]); }else { //????n-1?? int t = n-1; while(t--) { //??s?????????????????? int pt1,pt2; int _min = INF; for(int i = 0; i < n ; i ++) { if(_min > s[i]) { pt1 = i; _min = s[i]; } } _min = INF; for(int i = 0 ; i < n ; i ++) { if(_min > s[i] && i != pt1) { pt2 = i; _min = s[i]; } } sum += s[pt1] + s[pt2]; s[pt1] = s[pt1] + s[pt2]; s[pt2] = INF; } printf("%lld\n",sum); } return 0; }
标签:
原文地址:http://blog.csdn.net/area_52/article/details/42721055