您的位置:首页 > 其它

31-题目1107:搬水果

2016-03-03 21:28 351 查看

http://ac.jobdu.com/problem.php?pid=1107

明明是跟前一道题差不多的,也是求哈夫曼的值,但是就是直接copy代码过来就是不行。。。。可能是对数据的排序有要求。因为如果数据过大,那么不需要每次都从当前位置排到数组的末尾,只需要排两个位置就可以了。但是我这样改之后还是不对。所以我就找了一个建立小根堆的算法,AC了。。。用STL模板做的,希望以后能熟练掌握。

自己的代码:(没有AC,runtime error)

#include<stdio.h>
#include<string.h>
#include<fstream>
#include<algorithm>
#include<iostream>
using namespace std;

int main(){
int n, i;
ifstream cin("data.txt");
while (cin >> n && n != 0)
{
int *arr = new int
;
for (i = 0; i < n; i++)
cin >> arr[i];
sort(arr, arr + n);
int sum = 0;
for (i = 1; i < n; i++)
{
sum += arr[i - 1] + arr[i];
arr[i] = arr[i - 1] + arr[i];
sort(arr + i - 1, arr + i + 1);   //将arr[i-1],arr[n-1]递增排序
}
printf_s("%d\n", sum);
}
system("pause");
return 0;
}
小根堆:

//优先队列建立最小堆 AC 40ms
#include <iostream>
#include<fstream>
#include <cstdio>
#include <queue>
#include <functional> // std::greater STL 定义运算函数(代替运算符)
using namespace std;

int main()
{
int n, a, sum;
priority_queue<int, vector<int>, greater<int> > q;
ifstream cin("data.txt");
while (cin >> n && n != 0)
{
sum = 0;
for (int i = 0; i<n; i++)
{
cin >> a;
q.push(a);
}
while (q.size() >= 2)   //这是小根堆???
{
int b = q.top();
q.pop();
int c = q.top();
q.pop();
q.push(b + c);
sum += b + c;
}
cout << sum << endl;
q.pop();
}
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: