ST算法
输入时找出value的最大值max,则分组最少为n/max(分组从1开始枚举好像要TLE);然后枚举之后的分组,在每个分组内找最大值(典型RMQ问题),sum+=RMQ(L,R);当碰到第一个满足条件的分组(sum>k注意,题中说的large,是大于,不是大于等于,这地方我WA几次都没发现)时,break跳出循环,然后输出即可。
#include <cstdio> #include <cstring> #include <iostream> #define MAXN 200005 using namespace std; int f[MAXN][20]; int n,num[MAXN]; int MAX(int a,int b) { return a>b?a:b; } void init_RMQ() { for(int i=0;i<n;i++) f[i][0]=num[i]; for(int k=1;(1<<k)<=n;k++) for(int i=0;i+(1<<k)-1<n;i++) f[i][k]=MAX(f[i][k-1],f[i+(1<<(k-1))][k-1]); } int RMQ(int l,int r) { int k=0; while(1<<(k+1)<=r-l+1) k++; return MAX(f[l][k],f[r-(1<<k)+1][k]); } int main() { int k; while(scanf("%d%d",&n,&k)) { if(n<0&&k<0) break; int max=0; int sum=0; for(int i=0;i<n;i++) { scanf("%d",&num[i]); sum+=num[i]; if(max<num[i]) max=num[i]; } if(sum<k) { printf("-1\n"); continue; } init_RMQ(); int zushu=k/max; int renshu; int new_sum; if(zushu==0) zushu=1; for(;zushu<=n;zushu++) { renshu=n/zushu; new_sum=0; for(int i=1;i<=zushu;i++) new_sum+=RMQ((i-1)*renshu,i*renshu-1); if(new_sum>k) break; } printf("%d\n",zushu); } return 0; }
本文介绍了一种使用ST算法解决分组最大和问题的方法,通过枚举分组并利用RMQ技巧,实现了高效求解。关键步骤包括初始化RMQ、计算分组和值、以及找到满足条件的最小分组数量。
2786

被折叠的 条评论
为什么被折叠?



