HDU - 6709(思维+贪心)

感谢两位大佬的博客:

大佬博客 大佬博客

题解:

首先第一条鱼是要在煮鱼之前要钓的。

如果煮鱼期间我们可以钓到\sum_{i}^{n}\frac{a_{i}}{k}这么多鱼,如果不小于n - 1,那么就不会浪费时间,否则少的鱼数就需要我们再花费时间去抓。

我们对每一个a_{i} % k从大到小排序,少几条就加上几条浪费的时间

代码如下

void solve()
{
    LL n, k; scanf("%lld%lld", &n, &k);
    LL ans = k, cnt = 0;
    for (int i = 0; i < n; i ++ )
    {
        LL t; scanf("%lld", &t);
        ans += t;
        a[i] = t % k, cnt += t / k;
    }

    if (cnt >= n - 1)
    {
        printf("%lld\n", ans);
        return;
    }

    sort(a, a + n, greater<int>());

    for (int i = 0; i < n - 1 - cnt; i ++ )
        ans += k - a[i];

    printf("%lld\n", ans);
}

优先队列的做法: 煮鱼花费时间最长的肯定先煮,这样抓到的额外的鱼才能尽可能的多

void solve()
{
    LL n, k; scanf("%lld%lld", &n, &k);
    LL ans = k, cnt = 1;

    for (int i = 1; i <= n; i ++ ) scanf("%lld", &t[i]);
    sort(t + 1, t + 1 + n, greater<int> ());

    priority_queue<int> heap;

    for (int i = 1; i <= n; i ++ )//煮n条鱼
    {
        ans += t[i]; //将煮每条鱼所用时间加到答案里
        cnt += t[i] / k;//煮第i条鱼期间可以抓到的鱼
        if (cnt < i) //如果第i条鱼没有抓到,就要在之前浪费时间抓鱼
        {
            ans += k - heap.top();//选择t % k最大的那条鱼后钓第i条鱼
            heap.pop();
        }
        heap.push(t[i] % k);
    }

    printf("%lld\n", ans);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值