1148: [CTSC2007]挂缀pendant

题目链接

题目大意: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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值