Lemonade Line(USACO18OPEN)
题意
牛口渴了,要来和水,排队的时候,每头牛都有心理的最大忍耐度,前面的人数要是多于这个值,它就会忍不了,然后就走牛了。问这条队最短能排多长。
思路
牛分为忍耐度高的和忍耐度低的,要尽可能让队伍短,那么就尽可能的让忍耐度高的在前面占位置,让忍耐度低的在后面气的走人。
所以读完数据后按忍耐度由大到小排序,然后遍历位置和它们的忍耐度的关系,一直遍历到有牛开始走了的位置(在这后面的牛也都会走),就得到答案了。
代码
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int cnt=0;
int cmp(int a,int b)
{
return a>b;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+n,cmp);
int ans=0,flag=0;
for(int i=1;i<=n;i++)
{
ans=i-1;
if(i-a[i]>1)
{
flag=1;
break;
}
}
if(flag==1)
printf("%d\n",ans);
else
printf("%d\n",n);
return 0;
}