题目大意:n个珠子,每颗有重量和载重量,一个合法的挂坠需要其上每一个珠子下面的所有珠子的重量和小于这个珠子的载重量
求挂坠最长长度及此时最小重量
题解:显然可以用经典的堆维护贪心方法来搞
现在思考按照什么排序
理性(感性)瞎猜一下,发现按照c+w排序
证明
似乎这种题都这样排?
这个题没有数据范围!!!!我开始的时候用int WA了,我就都替换成long long了……
我的收获: 套路深
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
const int M=1000005;
long long n,num;
long long m;
struct data{long long v,w;}a[M];
priority_queue<long long> q;
bool cmp(data a,data b){return a.w+a.v<b.w+b.v;}
void work()
{
for(long long i=1;i<=n;i++)
{
num++;m+=a[i].w;q.push(a[i].w);
if(m-a[i].w>a[i].v){num--;m-=q.top();q.pop();}
//重量和不包括自身
}
printf("%lld\n%lld\n",num,m);
}
void init()
{
cin>>n;
for(long long i=1;i<=n;i++) scanf("%lld%lld",&a[i].v,&a[i].w);
sort(a+1,a+1+n,cmp);
}
int main()
{
init();
work();
return 0;
}