P2062 分队问题
题目描述
给定 n n n 个选手,将他们分成若干只队伍。其中第 i i i 个选手要求自己所属的队伍的人数大等于 a i a_i ai 人。
在满足所有选手的要求的前提下,最大化队伍的总数。
注:每个选手属于且仅属于一支队伍。
输入格式
第一行一个整数 n n n,表示人数。
以下 n n n 行,每行一个整数表示 a i a_i ai。
输出格式
输出队伍总数的最大值。数据保证有解。
输入输出样例 #1
输入 #1
5
2
1
2
2
3
输出 #1
2
说明/提示
对于 20 % 20\% 20% 的数据, n ≤ 10 n \leq 10 n≤10。
对于 40 % 40\% 40% 的数据, n ≤ 1000 n \leq 1000 n≤1000。
对于 60 % 60\% 60% 的数据, n ≤ 10000 n \leq 10000 n≤10000。
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 1 0 6 1 \leq n \leq 10^6 1≤n≤106。
C++实现
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll int
#define inf 1<<30
#define il inline
il ll max(ll x,ll y){return x>y?x:y;}
il ll min(ll x,ll y){return x<y?x:y;}
il ll abs(ll x){return x>0?x:-x;}
il void swap(ll &x,ll &y){ll t=x;x=y;y=t;}
il void read(ll &x){
x=0;ll f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
x*=f;
}
il void print(ll x){if(x<0)putchar('-');x=abs(x);if(x>9)print(x/10);putchar(x%10+'0');}
il void writeln(ll x){if(x<0)putchar('-');x=abs(x);print(x);putchar('\n');}
il void write(ll x){if(x<0)putchar('-');x=abs(x);print(x);putchar(' ');}
using namespace std;
#define N 1000100
ll n,a[N],f[N],g[N];
int main(){
read(n);
for(ll i=1;i<=n;i++)read(a[i]);
sort(a+1,a+n+1);
for(ll i=1;i<=n;i++){
if(i>=a[i])f[i]=g[i-a[i]]+1;
g[i]=max(f[i],g[i-1]);
}
writeln(f[n]);
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容