题目大意:
有N个人,每个人都有一个要求a[i],意思是ta所在队伍人数必须大于或等于a[i]
解题思路:
dp/贪心
表示贪心打起来简单 从大到小排序一遍,然后贪心具体看源程序 dp的话只给出方程: f[i]表示前i名队员最多分成的队伍数量 f[i]=max(f[j])+1,j∈[0,i–a[i]]f[i]=max(f[j])+1,j∈[0,i–a[i]]
前缀和优化 f[i]=s[i–a[i]]+1;s[i]=max(s[i−1],f[i]);f[i]=s[i–a[i]]+1;s[i]=max(s[i−1],f[i]);
源程序:
#include#include using namespace std;int n,a[1000001],ans;bool cmp(int x,int y){ return x>y;}int main(){ scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1,cmp); int now=a[1];//当前需求量 for (int i=1;i<=n;i++) { if (a[i]