蓝桥云课【算法赛】3.老君炼丹 题型:数据结构

60 阅读1分钟

3.老君炼丹【算法赛】 - 蓝桥云课 (lanqiao.cn)

我想的是先给数组排个序,这样负值全部在前面,正值全部在后面.然后全部放进双端队列里.每次取出队头队尾进行相加,如果说队头队尾都是正值,那么就输出"N",同时结束程序.否则就进行相加完之后弹出队头队尾元素,如果最后队里面只剩最后一个元素那么就输出"Y",结束程序.

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e3 + 10;
int a[N];
signed main()
{
    // 请在此输入您的代码
    cin.tie(nullptr)->sync_with_stdio(false);
    deque<int> q;
    int n; cin >> n;

    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }

    sort(a, a + n);

    for (int i = 0; i < n; i++)
    {
        q.push_back(a[i]);
    }

    int temp = 0;
    while (!q.empty())
    {
        if (q.size() == 1)
        {
            cout << "Y";
            return 0;
        }
        int f = q.front(), b = q.back();
        if (f > 0 && b > 0)
        {
            cout << "N";
            return 0;
        }
        else
            temp += f + b;
        q.pop_front();
        q.pop_back();
    }

    return 0;
}

image.png

用优先队列就可以全过

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e3+10;
int a[N];
signed main()
{
  cin.tie(nullptr)->sync_with_stdio(false);
 priority_queue<int,vector<int>,greater<int>> pq1;
   priority_queue<int,vector<int>,less<int>> pq2;
  int n;cin>>n;
  for(int i=0;i<n;i++)
  {
    cin>>a[i];
    if(a[i]>0)pq1.push(a[i]);
    else if(a[i]<0)pq2.push(a[i]);
  }


  while(pq1.size()&&pq2.size())  
  {
    int t1=pq1.top(),t2=pq2.top();
    pq1.pop();
    pq2.pop();

    int temp=t1+t2;
    if(temp>0)pq1.push(temp);
    else if(temp<0)pq2.push(temp);
  }

  if((pq1.size()+pq2.size()==0)||(pq1.size()+pq2.size()==1))  //两个队列里丹药都没了,说明刚好凑成了一个药效为0的药材  || 两个队列相加丹药数量为1,说明融合成一粒仙丹。
  cout<<"Y";else cout<<"N";
  
  
  return 0;
}

image.png