51nod 1117聪明的木匠-贪心算法
2017-12-05 19:59
513 查看
题目链接:1117
典型的贪心算法
不去考虑怎么切木材,考虑怎么把所有切好的木材拼成原来的整根木头。可以发现每次拼木头时剩下的木头数量减少1(两段拼好后变一段然后放回),也就是总共会拼接N-1次,每次花费的体力是两截木头的长度,只要保证每次拼接的是剩余木头中长度最短的两截就能保证花费最少。
借助优先队列实现。
代码:
#include<iostream>
#include<queue>
using namespace std;
int main(){
priority_queue<long long,vector<long long>,greater<long long> > q;
long long n,u,v,ans=0;
cin>>n;
while(n--){
cin>>u;
q.push(u);
}
while(q.size()>1){
u=q.top();q.pop();
v=q.top();q.pop();
ans+=u+v;
q.push(u+v);
}
cout<<ans;
}
典型的贪心算法
不去考虑怎么切木材,考虑怎么把所有切好的木材拼成原来的整根木头。可以发现每次拼木头时剩下的木头数量减少1(两段拼好后变一段然后放回),也就是总共会拼接N-1次,每次花费的体力是两截木头的长度,只要保证每次拼接的是剩余木头中长度最短的两截就能保证花费最少。
借助优先队列实现。
代码:
#include<iostream>
#include<queue>
using namespace std;
int main(){
priority_queue<long long,vector<long long>,greater<long long> > q;
long long n,u,v,ans=0;
cin>>n;
while(n--){
cin>>u;
q.push(u);
}
while(q.size()>1){
u=q.top();q.pop();
v=q.top();q.pop();
ans+=u+v;
q.push(u+v);
}
cout<<ans;
}
相关文章推荐
- 51NOD——1117 聪明的木匠(可用优先队列解决的贪心算法)
- 51nod 1117 聪明的木匠
- 51nod 1117 聪明的木匠 (哈夫曼树)
- 51nod 1117 聪明的木匠
- 51nod-【1117 聪明的木匠】
- 51nod 1117 聪明的木匠 (优先队列_STL)
- 51Nod-1117-聪明的木匠
- 51nod 1117 聪明的木匠 (贪心)
- 51Nod 1117 聪明的木匠(贪心+优先队列)
- 51Nod-1117-聪明的木匠
- 51nod-1117 聪明的木匠
- 51nod 1117 聪明的木匠(贪心)
- 51Nod 1117 聪明的木匠 (优先队列构造哈夫曼树)
- 51nod 1117 聪明的木匠【贪心+优先队列】
- 【51nod】1117 聪明的木匠
- 【51Nod】1117 聪明的木匠
- 51nod 1117 聪明的木匠(简单贪心)
- 51nod 1117 聪明的木匠
- 51nod-1117 聪明的木匠
- 51NOD 1117 聪明的木匠