题意:给出n个单词和屏幕宽度,问最少多少行能将所有单词显示出来。
思路:rmq预处理一下区间最大值然后暴力乱搞即可。
#include<bits/stdc++.h>
#define eps 1e-6
#define LL long long
#define pii pair<int, int>
#define pb push_back
#define mp make_pair
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int MAXN = 100100;
//const int INF = 0x3f3f3f3f;
int n, w;
int a[MAXN], dmax[MAXN][20];
void RMQ_init() {
for(int i = 1; i <= n; i++) dmax[i][0] = a[i];
for(int j = 1; (1<<j) <= n; j++) {
for(int i = 1; i+(1<<j)-1 <= n; i++)
dmax[i][j] = max(dmax[i][j-1], dmax[i+(1<<(j-1))][j-1]);
}
}
int RMQ(int L, int R) {
int k = 0;
while((1<<(k+1)) <= R-L+1) k++;
return max(dmax[L][k], dmax[R-(1<<k)+1][k]);
}
int main()
{
//freopen("input.txt", "r", stdin);
scanf("%d%d", &n, &w);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
RMQ_init();
int ans;
for (int i = 1; i <= n; i++) {
int col = (n+i-1) / i;
LL sumv = 0;
for (int j = 1; j <= n;) {
sumv += RMQ(j, min(j+i-1,n));
j += i;
}
sumv += col - 1;
if (sumv <= w) {
ans = i;
break;
}
}
cout << ans;
return 0;
}