Robin Hood CodeForces - 672D

http://codeforces.com/problemset/problem/672/D

一共k天 每天最富的人给最穷的人一块钱 问k天后最富和最穷的人财富之差

其实这道题里最终的最大最小财富值没有太大关系 可以分别二分判断 最小值一定在平均值之下 最大值一定在平均值之上 两者在各自的范围内二分确定一下就好了

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

ll ary[500010];
ll k;
int n;

bool judgeI(ll lim)
{
    ll res;
    int i;
    res=0;
    for(i=1;i<=n;i++)
    {
        if(ary[i]<lim) res+=lim-ary[i];
    }
    if(res<=k) return true;
    else return false;
}

bool judgeII(ll lim)
{
    ll res;
    int i;
    res=0;
    for(i=n;i>=1;i--)
    {
        if(ary[i]>lim) res+=ary[i]-lim;
    }
    if(res<=k) return true;
    else return false;
}

int main()
{
    ll sum,maxx,l,r,m,ans1,ans2;
    int i;
    scanf("%d%lld",&n,&k);
    sum=0;
    for(i=1;i<=n;i++)
    {
        scanf("%lld",&ary[i]);
        sum+=ary[i];
        maxx=max(maxx,ary[i]);
    }
    sort(ary+1,ary+n+1);
    l=1,r=sum/n;
    while(l<=r)
    {
        m=(l+r)/2;
        if(judgeI(m)) l=m+1,ans1=m;
        else r=m-1;
    }
    l=sum/n,r=maxx;
    if(sum%n!=0) l++;
    while(l<=r)
    {
        m=(l+r)/2;
        if(judgeII(m)) r=m-1,ans2=m;
        else l=m+1;
    }

    printf("%lld\n",ans2-ans1);
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: robin_hood::unordered_set是一种基于开放寻址的哈希表实现,它是C++ STL中的一个无序集合容器。与标准的unordered_set相比,robin_hood::unordered_set有着更高的性能。 robin_hood::unordered_set的实现方式采用了"robin hood"哈希算法,这种算法通过再哈希的方式处理冲突,将冲突的元素移到更远的位置,从而保持高效的查找性能。这种算法使得插入和删除操作具有O(1)的时间复杂度,而查找操作虽然在最坏情况下也是O(n),但实际上在大多数情况下是O(1)的。 此外,robin_hood::unordered_set在内存使用上也比标准的unordered_set更为高效。它采用了连续的内存布局,并使用了布隆过滤器来减少哈希冲突的数量,从而减少了内存的占用。 使用robin_hood::unordered_set时,可以通过插入、删除和查找等操作来管理集合中的元素。插入操作可以将元素添加到集合中,删除操作可以从集合中移除指定的元素,而查找操作可以判断集合中是否存在某个元素。 总的来说,robin_hood::unordered_set是一种高效的无序集合容器,适用于需要频繁进行插入、删除和查找操作的场景。它通过"robin hood"哈希算法和优化的内存使用方式,在性能和内存占用方面均有优势。 ### 回答2: Robin Hood是一个著名的英雄人物,他以偷取富人财物来帮助穷人而闻名。而unordered_set是C++ STL库中的一个数据结构,它是一个无序的集合,允许快速地插入、查找和删除元素。 尽管二者似乎没有直接联系,但是我们可以通过一些类比来理解它们之间的关系。就像Robin Hood通过偷取富人的财物来帮助穷人一样,unordered_set可以用来解决一些问题,比如查找和删除元素,这些问题在其他数据结构中可能需要更多的时间和资源。 就像Robin Hood能够迅速地从富人身上夺取财物,unordered_set在最佳情况下能够以O(1)的时间复杂度插入、查找和删除元素,这取决于哈希函数的性能。这使得它在一些需要高效率操作的场景中非常有用,比如去重、查找等。 然而,就像Robin Hood有时候可能会遇到困难一样,unordered_set也有一些限制。由于其无序的特点,它在有序访问元素方面相对较弱。此外,当元素数量较大时,哈希冲突的概率也会增加,导致性能下降。因此,在某些情况下,我们可能需要考虑使用其他更适合的数据结构。 总之,尽管Robin Hood和unordered_set在本质上是不同的,但通过类比,我们可以更好地理解unordered_set的特点和用途。无论是Robin Hood还是unordered_set,它们都有自己独特的功能和限制,我们需要根据具体的问题和需求来选择使用它们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值