题解 | #Greedy Gift Takers#

Greedy Gift Takers

https://ac.nowcoder.com/acm/problem/24083

思路: 首先我们可以发现,如果第x个牛不能拿到礼物,则x之后的所有牛都不能拿到礼物,则区间具有单调性,可以想到用二分来解决 然后思考怎么写判断条件 我们需要知道一个结论: 怎么样会形成一个死循环呢?如果出现在前i个位置的牛多于i个,则这i个牛就会一直卡在这前i个位置,我们预处理出小于二分值位置的数量,判断每个位置i的牛是否多于i个,如果多于,证明二分答案大了,需要缩小右区间,反之则缩小左区间,直到找到答案位置为止。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;
const int N = 100010;
int main()
{
    int n;cin>>n;
    vector<int>a(n+1);
    for(int i=1;i<=n;i++)cin>>a[i],a[i]=n-a[i];
    function<bool(int)> check = [&](int mid)->bool
    {
        int s[N]={0},sum=0;
        for(int i=1;i<mid;i++)s[a[i]]++;
        for(int i=1;i<mid;i++)
        {
            sum+=s[i];
            if(sum>=i)return true;
        }
        return false;
    };
    int l=0,r=n;
    while(l<r)
    {
        int mid=l+r+1>>1;
        if(check(mid))r=mid-1;
        else l=mid;
    }
    cout<<n-r<<endl;
}
全部评论

相关推荐

微风不断:兄弟,你把四旋翼都做出来了那个挺难的吧
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务