首页 > 代码库 > 汕头市队赛 SRM10 T1 贪心只能过样例

汕头市队赛 SRM10 T1 贪心只能过样例

贪心只能过样例 SRM 10

描述

给出n个数a[i](1<=a[i]<=n),问最多能把这些数分成几组,使得每个数a[i]所在的组至少有a[i]个数

输入格式

第一行一个整数n,接下来n行每行一个整数分别是a[1],a[2],...,a[n]

输出格式

一行,输出答案,一个整数

样例输入

5
2
1
2
2
3

样例输出

2

数据范围与约定

数据有梯度,分布如下:
0<n<=20 7组数据
20<n<=5000 15组数据
5000<n<=1000000 23组数据

样例解释

一种方案是分为2,2和1,2,3两组

————————————————————————

这道题维护一波前缀最小值就好了QAQ

技术分享
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=1000007,inf=0x3f3f3f3f;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<0||c>9){if(c==-) f=-1; c=getchar();}
    while(c>=0&&c<=9){ans=ans*10+(c-0); c=getchar();}
    return ans*f;
}
LL n,w[M],ans;
LL f[M],mx[M];
int main()
{
    n=read();
    for(int i=1;i<=n;i++) w[i]=read();
    sort(w+1,w+1+n);
    for(int i=1;i<=n;i++){
        if(i-w[i]<0) f[i]=0;
        else f[i]=mx[i-w[i]]+1;
        mx[i]=max(f[i],mx[i-1]);
    }printf("%lld\n",f[n]);
    return 0;
}
View Code

 

汕头市队赛 SRM10 T1 贪心只能过样例