请问昨天at的e题能用反悔贪心做吗?能否hack?
查看原帖
请问昨天at的e题能用反悔贪心做吗?能否hack?
920406
违规用户名920406楼主2025/1/12 10:25

声明:这是本萌新的一个问题,不是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;
}
2025/1/12 10:25
加载中...