NC209809. 乐团派对
描述
音乐是带给大家快乐的存在,而你的目标就是组建若干支乐队,让世界听到你们的演奏!
你目前有位乐手,每位乐手只能进入一个乐队,但并不是每位乐手都能担大任,因此需要团队合作。第位乐手的能力值为,表示该位乐手所在乐队的人数必须大于等于。在保证每位乐手都被分进一个乐队的情况下,乐队数量最多可以是多少?
输入描述
第一行一个正整数,表示乐手人数,。
第二行个正整数,表示每位乐手的能力值,。
输出描述
输出最多的乐队数量。若无法保证每位乐手都被分进一个乐队,则输出-1。
示例1
输入:
4 2 1 2 1
输出:
3
C++11(clang++ 3.9) 解法, 执行用时: 41ms, 内存消耗: 1164K, 提交时间: 2020-08-24 09:52:11
#include<bits/stdc++.h> using namespace std; int n,s[100010],dp[100010]; int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>s[i]; sort(s+1,s+n+1); for(int i=1;i<=n;i++){ if(s[i]<=i)dp[i]=max(dp[i-1],dp[i-s[i]]+1); } if(s[n]>n)cout<<"-1"<<endl; else cout<<dp[n]<<endl; return 0; }
C++14(g++5.4) 解法, 执行用时: 41ms, 内存消耗: 1144K, 提交时间: 2020-09-10 12:14:19
#include<bits/stdc++.h> using namespace std; int n,a[100005],mx[100005],dp; int main(){ cin>>n; for(int i=1;i<=n;++i)cin>>a[i]; sort(a+1,a+1+n); for(int i=1;i<=n;++i){ dp=a[i]<=i?mx[i-a[i]]+1:0; mx[i]=max(mx[i-1],dp); } cout<<(dp?dp:-1); }
Python3(3.9) 解法, 执行用时: 75ms, 内存消耗: 14568K, 提交时间: 2021-04-05 15:51:36
n=int(input()) a=list(map(int,input().split())) a.sort() if(n<a[-1]): print(-1) else: a=a[:n-a[-1]] cnt=ans=0 for i in a: cnt+=1 if(cnt>=i): ans+=1 cnt=0 print(ans+1)