乐团派对
解题思路
①、排序并存储。 将乐队的能力值从高到底排序,存储在 arr 数组中。
②、判断是否每一位乐手都能加入乐队。 我们需要保证每个乐手能被分进同一个乐队,那么就判断将能力值最高的乐手是否小于或等于乐手总人数( arr[n-1] 与 n )。若小于或等于,那么乐队数量为1并进入③,否则直接输出 -1 便退出程序。
③、寻找最大的乐队数量。 在区间 arr[0] ~ n - arr[n-1]-1 上组建新的乐队。每能组建一支队伍则乐队数量加1。
④、得到最大乐队数。 最终遍历完 arr[0] ~ n - arr[n-1]-1的乐队数量,即为最大乐队数。
#include<bits/stdc++.h>
#define ll long long
using namespace std
;
int arr
[100010];
int main(){
int n
;
scanf("%d", &n
);
for(int i
=0; i
<n
; i
++)
scanf("%d", &arr
[i
]);
sort(arr
, arr
+n
);
if(arr
[n
-1]>n
){
printf("-1\n");
return 0;
}
int num
=0, ans
=1;
for(int i
=0; i
<n
-arr
[n
-1]; i
++){
num
++;
if(num
>=arr
[i
]){
ans
++;
num
=0;
}
}
printf("%d\n", ans
);
return 0;
}
总结
这道题题意明了,但判断每个乐手能否加入乐队的方式与找到最大的乐队数量的方式是不同的,要善于观察题目,提取精髓。