poj3253

原创 2015年07月10日 21:03:50
              **## 贪心法 ##**

开始的思路是:
1.N个数据排序
2.将最小的两个数据相加的和与剩下的数据合在一起组成N-1个数据,并将最小的两个数据相加的和存储在res中。
3.重复1,2直到剩下一个数据。
但是出现了Time Limit Exceeded

#include <iostream>
#include <algorithm>
#define MAX_N 20000
using namespace std;

int L[MAX_N],N;
long long ans=0;
void slove()
{
    int j,temp,mi=0;
    while(N-mi>1){
        L[mi+1]+=L[mi];
        ans+=L[mi+1];
        sort(L+mi+1,L+N);
    mi++;
    }
}

int main()
{
    cin>>N;
    for(int i=0;i<N;i++)
        cin>>L[i];
    sort(L,L+N);
    slove();
    cout<<ans<<endl;
    return 0;
}

随后 进行了修改,将每次将两个最小的数之和插入以排好序的数组中。

#include <iostream>
#include <algorithm>
#define MAX_N 20000
using namespace std;

int L[MAX_N],N;
long long ans=0;
void slove()
{
    int j,temp,mi=0;
    while(N-mi>1){
        L[mi+1]+=L[mi];
        ans+=L[mi+1];
        temp=L[mi+1];
        for(int i=mi+2;i<N;i++){  //进行插入
            if(temp<L[i]){
            for(j=mi+1;j<i-1;j++)
                L[j]=L[j+1];
            L[j]=temp;
            break;
            }
            if(i==N-1){
                for(j=mi+1;j<i;j++)
                     L[j]=L[j+1];
                L[j]=temp;
            }
        }
    mi++;
    }
}
int main()
{
    cin>>N;
    for(int i=0;i<N;i++)
        cin>>L[i];
    sort(L,L+N);
    slove();
    cout<<ans<<endl;
    return 0;
}

此题还可以用最优队列解。

//poj 3253 (优先队列)
#include <iostream>
#include <queue>
#define MAX_N 20000
using namespace std;
int L[MAX_N],N;
void slove()
{
    long long res=0;
    priority_queue<int,vector<int>,greater<int> >que;
    for(int i=0;i<N;i++)
        que.push(L[i]);
    while(que.size()>1)
    {
        int t1=que.top();
        que.pop();
        int t2=que.top();
        que.pop();
        que.push(t1+t2);
        res+=t1+t2;
    }
    cout<<res<<endl;
}
int main()
{
    cin>>N;
    for(int i=0;i<N;i++)
        cin>>L[i];
    slove();

    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ3253(STL)

题意:割木板,割木板的长度就是化的钱。比如你要8 8 5 的木板,最简单的方式是把21的木板割成13,8,花费21,再把13割成5,8,花费13,共计34,当然也可以先割成16,5的木板,花费21,再...
  • Since_natural_ran
  • Since_natural_ran
  • 2016年11月22日 19:43
  • 675

POJ3253解题报告

题目的大致意思为:有一块长木板,要经过n-1次切割将其切成n块FJ想要的木板,对于每块木板,没切割一次,将会消耗和这条木板长度值相等的金钱,问最少需要多少钱,可将木板切成自己想要的n块。算法:题目看起...
  • Moon_1st
  • Moon_1st
  • 2010年02月18日 12:47
  • 3969

POJ3253 Fence Repair 贪心法 哈夫曼树

贪心专题 哈夫曼树
  • qq_26071477
  • qq_26071477
  • 2016年06月14日 16:57
  • 496

poj 3253 Fence Repair (STL优先队列)

poj 3253 Fence Repair (STL优先队列)
  • u012860063
  • u012860063
  • 2014年06月26日 09:58
  • 1428

poj3253

水题赚访问量之第二篇~ Huffman编码,优先队列使用。 #include  #include  #include  #include  using names...
  • zhengnanlee
  • zhengnanlee
  • 2013年11月24日 20:33
  • 830

POJ3253

#include #include #include #define maxn 20000 using namespace std; int l[maxn]; ...
  • u013570474
  • u013570474
  • 2014年07月13日 11:52
  • 208

POJ3253(贪心)

1.要考虑到规模为20,000 累加起来肯定会超的,要用long long 2. 思想就是先从正着推,一定是先切掉最长的那块,这样之后都不会受影响;再反着来想,就是先合并最小的 //#define...
  • zem_nezer
  • zem_nezer
  • 2018年02月09日 06:50
  • 3

poj3253 哈夫曼

Farmer John wants to repair a small length of the fence around the pasture. He measures the fence an...
  • tianyuhang123
  • tianyuhang123
  • 2017年05月21日 18:12
  • 67

堆--poj3253

题意:给几段切完了的木头,问原木棒如何切才能花费最少(花费为要切的木棒长度,比如刚开始21,切成13和8,然后切13的,花费为13)。 思路:用堆构造哈夫曼树,每次选出最大的两个元素,然后把她们的和重...
  • u010660276
  • u010660276
  • 2013年08月08日 17:31
  • 430

poj3253(优先队列)

#include #include #include #include #include using namespace std; int N,R; int x[50100]; int m...
  • u013445530
  • u013445530
  • 2015年02月09日 17:55
  • 850
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj3253
举报原因:
原因补充:

(最多只允许输入30个字)