基础算法之“蒜头君采摘苹果”

来源:互联网 发布:java视频教程谁的好 编辑:程序博客网 时间:2024/05/16 18:15

这是一道很简单的贪心,因为刚刚买这门课的时候水平很渣,只会暴力做法,就像下面的….
(注意这个没处理n=1的情况)

#include<iostream>using namespace std;#define INF 2147483648void insert_sort(long long a[],int n){    int i,j;    long long t;    for(i=1;i<n;++i)    {        t=a[i];        j=i-1;        while(j>=0&&a[j]>t)        {            a[j+1]=a[j];            j--;        }        a[j+1]=t;    } } int main(){    int n,i;    long long sum=0;    cin>>n;    long long a[n],b[n];    for(i=0;i<n;++i)    {        cin>>a[i];        b[i]=0;    }    insert_sort(a,n);    i=0;    while(a[1]!=INF)    {        a[0]=a[0]+a[1];        b[i]=a[0];        i++;        a[1]=INF;        insert_sort(a,n);    }    for(i=0;i<n;++i)    sum=sum+b[i];    cout<<sum;}

优先队列版本的:

#include<bits/stdc++.h>using namespace std;int main(){    int n,t,sum=0,tmp=0;    priority_queue<int,vector<int>,greater<int> >q;    scanf("%d",&n);    for(int i=0;i<n;i++)    {        scanf("%d",&t);        q.push(t);    }    if(q.size()==1)        printf("0");    else    {        int s=q.size();        for(int i=0;i<s-1;i++)        {            tmp=q.top();            q.pop();            tmp=tmp+q.top();            q.pop();            sum=sum+tmp;            q.push(tmp);        }        printf("%d",sum);    }    return 0;}