题目描述
音乐是带给大家快乐的存在,而你的目标就是组建若干支乐队,让世界听到你们的演奏!
你目前有n位乐手,每位乐手只能进入一个乐队,但并不是每位乐手都能担大任,因此需要团队合作。第i位乐手的能力值为a[i],表示该位乐手所在乐队的人数必须大于等于a[i]。在保证每位乐手都被分进一个乐队的情况下,乐队数量最多可以是多少?
思路:按照能力值排序,然后大概就找需要人少的。详见代码。
代码:
#include <bits/stdc++.h>
using namespace std;
int dp[100005],b[100005];
struct Node{
int pos;
int l,x;
}a[100005];
bool cmp(Node c,Node d)
{
return c.l>d.l;
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&b[i]);
sort(b,b+n);
int maxn=0;
for(int i=0;i<n;i++){
int x=b[i];
a[i].pos=i;
a[i].l=i-x;
a[i].x=x;
maxn=max(x,maxn);
}
sort(a,a+n,cmp);
if(maxn>n){
printf("-1\n");
return 0;
}
int i=0;
for(i=0;i<n;i++)if(a[i].x==maxn)break;
int l=a[i].l,ans=1;
i++;
while(i<n){
if(a[i].pos<=l){
ans++;
l=a[i].l;
}
//printf("%d %d\n",l,ans);
i++;
}
if(l!=-1)ans--;
printf("%d\n",ans);
return 0;
}


京公网安备 11010502036488号