声明:这是本萌新的一个问题,不是tlqtj,请不要误会
听说反悔贪心的严谨证明要用拟阵,蒟蒻不会,所以求助大佬
大致思路:建两个堆,q1保存暂时未配对的数,q2保存已配对的数,按每对中较大数从小到大排序。从左往右扫,扫到数x,如果q1堆顶可以和x配对,那么将它们加到q2,否则再看q2的堆顶,因为输入单调,所以将q2的较小数和x配对一定更好,就把q2的较大数换下来,放到q1,将较小数和x再重新组合
#include <bits/stdc++.h>
using namespace std;
int n,x,t,ans;
struct node
{
int x,y;
bool operator<(const node a) const
{
return y>a.y;
}
};
priority_queue<int,vector<int>,greater<int> > q1;
priority_queue<node> q2;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
if(!q1.empty()) t=q1.top();
if(!q1.empty()&&t*2<=x)
{
q1.pop();
q2.push({t,x});
ans++;
}
else if(!q2.empty())
{
node T=q2.top();
q2.pop();
q1.push(T.y);
q2.push({T.x,x});
}
else q1.push(x);
}
cout<<ans;
return 0;
}