Codeforces Round #303 (Div. 2) D. Queue 【贪心】

题意:n个人在超市排队买单。每个人花费的时间为a[i]。如果第i个人排队的时间大于买单的时间,那个人就会发火。问,最少可以让几个人不发火。

数据分析:1 ≤ n ≤ 105 :: 1 ≤ a[i] ≤ 1e9

思路:
1·错误思路:必须要让时间小的先买单,那么sort一下。然后求前缀和,再O(n)for一遍。如果sum[i] > a[i] ans++。

2.正确思路:假如第i个人生气了,那么这个人去后面排队。如果还让他买单,只会让后面生气的人数可能性增加。

复杂度分析:(nlogn+n)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxn=1e5+50;
int a[maxn];
ll sum[maxn];
ll ans=0;

int main(void)
{
    int n;
    cin >> n;
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    sort(a+1,a+1+n); // 时间
    ll sum=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i]<sum)
        {
            ans++;
            continue;
        }
        else    sum+=a[i];
    }
    cout << n-ans <<endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值