P4090 [USACO17DEC] Greedy Gift Takers P

原题链接

题解

1.如果前 \(7\) 头牛能全部能拿到礼物,但是这前 \(7\) 头牛里有 \(4\) 头牛更新在前 \(4\) 的位置,请问第 \(8\) 头牛能否得到礼物?
答案是不行,因为前 \(4\) 头牛会在前 \(4\) 的位置形成循环

2.假如恰好第 \(x\) 头牛没有礼物,那么牛 \(x\) 之后的牛都得不到礼物,因为不可能跨过牛 \(x\) 去拿礼物,由此得出一个现象:
\(x\) 之前的牛都能拿到礼物,之后的牛都拿不到礼物,这就是二分的由来

\(Code\)

#include<bits/stdc++.h>
using namespace std;
int a[100005];
int n;
int solve(int x)
{
    int cnt[n+5]={0},sum=0;
    for(int i=1;i<=x;i++)cnt[a[i]]++;
    for(int i=1;i<=x;i++)
    {
        sum+=cnt[i];
        if(sum>=i)return 0;
    }
    return 1;
}
int main()
{

    cin>>n;

    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        a[i]=n-a[i];
    }

    int l=1,r=n+1;
    while(l<r-1)
    {
        int mid=(l+r)/2;
        if(solve(mid))l=mid;
        else r=mid;
    }
    cout<<n-r<<endl;
    return 0;
}
posted @ 2024-02-10 17:52  纯粹的  阅读(24)  评论(0)    收藏  举报