首页 > 代码库 > 汕头市队赛 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组数据
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; }
汕头市队赛 SRM10 T1 贪心只能过样例
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。