分析:
单调性 显然二分
a
a
a值
根据题意
a
a
a值是比
b
b
b值更重要的
将
a
a
a值 及
b
b
b值排序
a
a
a值从小到大
b
b
b值从大到小 然后能穿就穿
因为
b
b
b值同时也可以帮你 穿上更多
b
b
b值就是当前装备需要
b
b
b值 减去 之前装备提供的
b
b
b值总和
然后开个
p
r
i
o
r
i
t
y
_
q
u
e
u
e
priority\_queue
priority_queue维护下最小的
b
b
b值即可
CODE:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int T,n;
ll sum;
struct qaq{
ll a,b,c,d;
bool operator <(qaq y) const
{
return b>y.b;
}
}qwq[N];
bool cmp(qaq x,qaq y)
{
if(x.a==y.a) return x.b<y.b;
return x.a<y.a;
}
bool check(ll x)
{
for(int i=1;i<=n;i++)
{
if(x<qwq[i].a) return 0;
x+=qwq[i].c;
}
return 1;
}
ll query(ll x)
{
ll res=0,sum=0;
int i=1;
priority_queue<qaq> q;
for(i=1;i<=n&&qwq[i].a<=x;i++)
q.push(qwq[i]);
while(!q.empty())
{
qaq k=q.top();
q.pop();
res=max(res,k.b-sum);
sum+=k.d;
x+=k.c;
for(;i<=n&&qwq[i].a<=x;i++)
q.push(qwq[i]);
}
return res;
}
int main(){
scanf("%d%d",&T,&n);
if(n==0){puts("0 0");return 0;}
for(int i=1;i<=n;i++)
{
scanf("%lld%lld%lld%lld",&qwq[i].a,&qwq[i].b,&qwq[i].c,&qwq[i].d);
sum+=qwq[i].a;
}
sort(qwq+1,qwq+n+1,cmp);
ll l=0,r=(sum<<1),ans=0;
while(l<=r)
{
ll mid=(l+r)>>1;
if(check(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
printf("%lld %lld",ans,query(ans));
return 0;
}