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;
}
用优先队列就可以全过
#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;
}