标签:style blog http color os io for art
题目地址:Fence Repair
题目大意:
一个农夫有个长度一定的木板,他想切成N段长度一定的木板,每次切割需要一定的费用,这个费用就是当前木板的长度,求切成N段农夫花费最小的费用。
解题思路:
因为每次切割是切成两段,而且要求花费的最少,这样可以逆向思想从最小的两段木板算起,这样加到最后,一定是花费最小的切割。利用的是Huffman思想,但是用的是优先队列,即每次将最小的两段长度优先加和,然后在放进队列里排队,再选取较小的两个,以此类推。
代码:
1 #include <algorithm> 2 #include <iostream> 3 #include <sstream> 4 #include <cstdlib> 5 #include <cstring> 6 #include <cstdio> 7 #include <string> 8 #include <bitset> 9 #include <vector> 10 #include <queue> 11 #include <stack> 12 #include <cmath> 13 #include <list> 14 #include <map> 15 #include <set> 16 using namespace std; 17 /***************************************/ 18 #define ll long long 19 #define int64 __int64 20 /***************************************/ 21 const int INF = 0x7f7f7f7f; 22 const double eps = 1e-8; 23 const double PIE=acos(-1.0); 24 const int d1x[]= {0,-1,0,1}; 25 const int d1y[]= {-1,0,1,0}; 26 const int d2x[]= {0,-1,0,1}; 27 const int d2y[]= {1,0,-1,0}; 28 const int fx[]= {-1,-1,-1,0,0,1,1,1}; 29 const int fy[]= {-1,0,1,-1,1,-1,0,1}; 30 /*vector <int>map[N];map[a].push_back(b);int len=map[v].size();*/ 31 /***************************************/ 32 void openfile() 33 { 34 freopen("data.in","rb",stdin); 35 freopen("data.out","wb",stdout); 36 } 37 priority_queue<int> qi1; 38 priority_queue<int, vector<int>, greater<int> >qi2; 39 /**********************华丽丽的分割线,以上为模板部分*****************/ 40 int main() 41 { 42 int n; 43 while(scanf("%d",&n)!=EOF) 44 { 45 int i; 46 int ce; 47 for(i=0;i<n;i++) 48 { 49 scanf("%d",&ce); 50 qi2.push(ce); 51 } 52 long long sum=0; 53 while(qi2.size()>1) 54 { 55 int u=qi2.top(); 56 qi2.pop(); 57 int v=qi2.top(); 58 qi2.pop(); 59 sum+=(u+v); 60 qi2.push(u+v); 61 } 62 printf("%lld\n",sum); 63 while(!qi2.empty()) 64 qi2.pop(); 65 } 66 return 0; 67 }
poj3253(Fence Repair),布布扣,bubuko.com
标签:style blog http color os io for art
原文地址:http://www.cnblogs.com/ZhaoPengkinghold/p/3868325.html