题解
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;
}
标签:头牛,int,USACO17DEC,Greedy,P4090,Takers,礼物
From: https://www.cnblogs.com/pure4knowledge/p/18012957