洛谷p1090__合并果子

发布时间 2023-11-15 21:00:00作者: 工作日摆烂

合并果子可以作为mulitset的板子题

 mulitset的 ac code

#include<iostream>
#include<set>
using namespace std;

multiset<int,less<int>> m;

int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int t;
        cin>>t;
        m.insert(t);
    }
    long long sum=0;
    for(int i=0;i<n-1;i++)
    {
        int a,b;
        a=*m.begin();
        m.erase( m.begin() );
        b=*m.begin();
        sum+=a;sum+=b;
        m.erase( m.begin() );
        m.insert(a+b);
    }
    cout<<sum;
    system("pause");
    return 0;
}

  除了这种方法,好鱼还提供了另一种解法:利用两个队列来搞定

#include<iostream>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

int arr[10005];
queue<int> m,p;

int main()
{
    int n;
    cin>>n;
    int sum=0;      //temp的作用是模拟副队列进行比较
    
    for(int i=0;i<n;i++)cin>>arr[i];
    sort(arr,arr+n);             //将输入的元素排列,下一步放入主队列

    for(int i=0;i<n;i++)m.push(arr[i]);   //此时得到一个有序队列,作为主队列
    
    int a,b;
    for(int i=0;i<n-1;i++)
    {
        if(p.size() && m.size())
        {
            a=min(m.front(),p.front());
            if(m.front()<p.front())m.pop();
            else p.pop();
        }
        else if(m.size())
        {
            a=m.front();m.pop();
        }
        else 
        {
            a=p.front();p.pop();
        }
        if(p.size() && m.size())
        {
            b=min(m.front(),p.front());
            if(m.front()<p.front())m.pop();
            else p.pop();
        }
        else if(m.size())
        {
            b=m.front();m.pop();
        }
        else 
        {
            b=p.front();p.pop();
        }
        sum+=(a+b);
        p.push(a+b);   //p队列里面的元素一定是有序的,显然
    }
    cout<<sum;
    system("pause");
    return 0;
}

  嗯,收获颇多。