题目描述
音乐是带给大家快乐的存在,而你的目标就是组建若干支乐队,让世界听到你们的演奏!
你目前有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; }