[Luogu 2062]分队问题

Description

给定n个选手,将他们分成若干只队伍。其中第i个选手要求自己所属的队伍的人数大等于a[i]人。

在满足所有选手的要求的前提下,最大化队伍的总数。

注:每个选手属于且仅属于一支队伍。

Input

第一行一个整数n,表示人数。

以下n行,每行一个整数表示a[i]。

Output

输出队伍总数的最大值。数据保证有解。

Sample Input

5
2
1
2
2
3 

Sample Output

2

Hint

对于20%的数据,n <= 10

对于40%的数据,n <= 1000

对于60%的数据,n <= 10000

对于100%的数据,1 <= n <= 10^6

题解

 1 #include<set>
 2 #include<map>
 3 #include<cmath>
 4 #include<ctime>
 5 #include<queue>
 6 #include<stack>
 7 #include<vector>
 8 #include<cstdio>
 9 #include<string>
10 #include<cstdlib>
11 #include<cstring>
12 #include<iostream>
13 #include<algorithm>
14 #define Max(a,b) ((a)>(b) ? (a):(b))
15 using namespace std;
16 const int N=1e6;
17 
18 int a[N+5],x,n;
19 int sorted[N+5],pos;
20 int f[N+5];
21 int s[N+5];
22 
23 int main()
24 {
25     scanf("%d",&n);
26     for (int i=1;i<=n;i++) scanf("%d",&x),a[x]++;
27     for (int i=1;i<=n;i++) for (int j=1;j<=a[i];j++) sorted[++pos]=i;
28     for (int i=1;i<=n;i++)
29     {
30         if (i>=sorted[i]) f[i]=1+s[i-sorted[i]];
31         else f[i]=0;
32         s[i]=Max(s[i-1],f[i]);
33     }
34     printf("%d
",f[n]);
35     return 0;
36 }
原文地址:https://www.cnblogs.com/NaVi-Awson/p/7448343.html