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; }
相关文章推荐
- PAT-A1062. Talent and Virtue (25)(排序)
- 个人项目1修改版——自动生成四则表达式
- 分享20个最新的免费 UI 设计素材给设计师
- 漫步森林
- 我的第一篇jsp文章
- [iOS问题归总]SourceTree+osChina版本管理出现的问题
- UC星座占卜H5
- PAT-A1050. String Subtraction (20)(哈希)
- 关于虚函数的那些事儿
- 什么是跨域请求
- HDU 1232 畅通工程(并查集)
- 如何设计一个 iOS 控件?(iOS 控件完全解析)
- SecureCRT配色方案
- Android底部导航栏界面(Fragment中嵌套Fragment)
- Weinre远程调试工具
- HDU 2191多重背包问题、
- Java基础知识拾遗(一)
- erlang和java通信
- 【C++】 单链表 .cpp
- “阻塞”与"非阻塞"与"同步"与“异步"