求Hack
查看原帖
求Hack
557463
yinpeichu2021楼主2022/10/27 21:37

rt,上代码:

#include<bits/stdc++.h>
#define int long long
// #define MOD 1000000007
using namespace std;
priority_queue<int,vector<int>,greater<int> >q; 
int n,k,m;
struct node{
    int x,y;
}a[50005];
bool cmp(node a,node b){
    return a.y<b.y;
}
bool cmp2(node a,node b){
    return a.x<b.x;
}
bool cmp3(node a,node b){
    return a.x-a.y>b.x-b.y;
}
int work2(){
    sort(a+1,a+n+1,cmp3);
    sort(a+k+1,a+n+1,cmp2);
    int ans=0;
    for(int i=1;i<=n;i++){
        if(i<=k){
            m-=a[i].y,ans++;
            if(m<0)ans--,m+=a[i].y;
        }
        else{
            m-=a[i].x,ans++;
            if(m<0)ans--,m+=a[i].x;
        }
    }
    return ans;
}
signed main(){
    cin>>n>>k>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i].x>>a[i].y;
    sort(a+1,a+n+1,cmp);
    int sum=0,tot=k;
    for(int i=1;i<=k;i++){
        sum+=a[i].y;
        q.push(a[i].x-a[i].y);
        if(sum>m)cout<<i-1,exit(0);
        if(i==n)cout<<i,exit(0);
    }
    sort(a+k+1,a+n+1,cmp2);
    for(int i=k+1;i<=n;i++){
        int t=INT_MAX;
        if(!q.empty())t=q.top();
        if(t<a[i].x-a[i].y){
            sum+=t;
            q.pop();
            q.push(a[i].x-a[i].y);
            sum+=a[i].y;
        }else sum+=a[i].x;
        if(sum>m)break;
        tot++;
    }
    cout<<max(tot,work2());
    return 0;
}
2022/10/27 21:37
加载中...